home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / mpl172b.zip / CNFG-SUB.BAS < prev    next >
BASIC Source File  |  1989-09-10  |  96KB  |  2,204 lines

  1. ' $linesize:132
  2. ' $title: 'CNFG-SUB.BAS CPC17-2B, Copyright 1987-89 by D. Thomas Mack'
  3. '  Copyright 1987,1988 and 1989 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: CNFG-SUB.BAS
  5. '  Written by .........: D. Thomas Mack
  6. '  First Released .....: May 28, 1989
  7. '  Subsequent Releases.: July 30, 1989
  8. '  Copyright ..........: 1987-89
  9. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  10. '                        RBBS-PC, configuration program -- CONFIG.BAS
  11. '                        utilizes a lot of menus and string space.
  12. '                        These are incorporated within CNFG-SUB.BAS as a
  13. '                        seperately callable subroutines in order to free
  14. '                        up as much code as possible within the 64K code
  15. '                        segment used by CONFIG.BAS.
  16. '  Parameters..........: Most parameters are passed via a COMMON statement.
  17. '
  18. ' Subroutine  Line      Function of Subroutine
  19. '    Name    Number
  20. ' ALLCAPS    61212+     Captialize a string
  21. ' ANSIDECODE 62040+     Convert ANSI strings into english text expressions
  22. ' ANYINTEGER 61450      Prompt for any integer
  23. ' ANYNUMBER  61400      Prompt for any number
  24. ' ASKRO      61100      Ask a question on a specific row
  25. ' ASKUPOS    61300      Ask for identifying field in USERS record
  26. ' BRKFNAME   61830      Break file name in drive/path, prefix, extension
  27. ' CHKFMSDIR  61700      Check FMS directory for valid structure
  28. ' CHKPERSDIR 61755      Check Personal directory format
  29. ' CNFGINIT   60385      Initialize CONFIG's constants
  30. ' COLORCODE  62040+     Convert response into ANSI-meaningful strings
  31. ' DISPLAY    12190      Display the CONFIG menu pages
  32. ' FINDFILE   61600      Determine whether a file exists
  33. ' FINDLAST   61850      Find last occurence of a character in a string
  34. ' GETANSI    62000      Prompt for ANSI colors to be used
  35. ' GETASCII   61810      Get any character by character or ascii value
  36. ' GETCOLOR   61950      Process request for setting color
  37. ' GETINIT    61110      Get answers that are integers
  38. ' GETNUMYN   61150      Get TRUE/FALSE answer to a YES/NO question
  39. ' GETYESNO   61200      Ask a question with a "yes" or "no" response
  40. ' HANDERR    61775+     Handle error checking for FMS directories
  41. ' MMINTEGER  61500      Prompt for integer with min and a max
  42. ' NETTYPE    60382      Prompt for supported network types
  43. ' REMOVE     61800      Remove characters from a string
  44. ' SECURE     61860      Allow commands and their security level to be changed
  45. ' TRIMTRAIL  61840      Remove trailing characters from a string
  46. '
  47. '  $INCLUDE: 'CNFG-VAR.BAS'
  48. '
  49. '  $SUBTITLE: 'DISPLAY - subroutine to display CONFIG's menus'
  50. '  $PAGE
  51. '
  52. '  SUBROUTINE NAME    --  DISPLAY
  53. '
  54. '  INPUT PARAMETERS   --  PARAMETER        DESCRIPTION
  55. '                         IX = 0           DISPLAY THE CHOICE OF MENUS
  56. '                         IX = -1          RE-READ THE INPUT (INVALID REQUEST)
  57. '                         IX > 0           DISPLAY THE APPROPRIATE PAGE
  58. '
  59. '  OUTPUT PARAMETERS  --  HJ$              OPTION SELECTED
  60. '                         IPAGE            MENU PAGE CONTAINING OPTION
  61. '                         ILOOKUP          INDEX (1 TO 20) OF OPTION SELECTED
  62. '
  63. '  SUBROUTINE PURPOSE --  TO DISPLAY CONFIG'S MENUS AND REQUEST OPTION
  64. '
  65.       SUB DISPLAY STATIC
  66. '
  67. ' *  DISPLAY CONFIG'S MAIN FUNCTION KEY MENU
  68. '
  69.       IF IX > 0 THEN _
  70.          GOTO 12320
  71.       IF IX = -1 THEN _
  72.          GOTO 12590
  73. 12190 COLOR FG,BG,BORDER
  74.       CLS
  75.       DISPLAYED.PAGE.NUMBER = 0
  76.       I! = FRE(C$)
  77.       COLOR 0,7,0
  78.       LOCATE 4,10
  79.       PRINT "MAPLE RBBS-PC "+ CONFIG.VERSION$ + " CONFIGURATION PROGRAM "
  80.       COLOR FG,BG,BORDER
  81.       LOCATE 1,1,0
  82.       PRINT "Copyright (c) 1983-1989 Tom Mack"
  83.       LOCATE 2,1,0
  84.       PRINT "39 Cranbury Dr, Trumbull, CT. 06611";
  85.       IF CONFERENCE.MODE THEN _
  86.          GOSUB 24970
  87.       LOCATE  5,1
  88.       PRINT "   F1            Global RBBS-PC Parameters (part 1)
  89.       PRINT "   F2            Global RBBS-PC Parameters (part 2)
  90.       PRINT "   F3            Global RBBS-PC Parameters (part 3)
  91.       PRINT "   F4            RBBS-PC System Files (part 1)
  92.       PRINT "   F5            RBBS-PC System Files (part 2)
  93.       PRINT "   F6            Parameters for RBBS-PC's 'Doors'
  94.       PRINT "   F7            Parameters for RBBS-PC's Security (part 1)
  95.       PRINT "   F8            Parameters for RBBS-PC's Security (part 2)
  96.       PRINT "   F9            Parameters for multiple RBBS-PC's
  97.       PRINT "  F10            RBBS-PC utilities
  98.       PRINT "  Shift-F1       RBBS-PC File Management Faciliites"
  99.       PRINT "  Shift-F2       RBBS-PC Communications Parameters (part 1)
  100.       PRINT "  Shift-F3       RBBS-PC Communications Parameters (part 2)
  101.       PRINT "  Shift-F4       Parameters for RBBS-PC NET-MAIL
  102.       PRINT "  Shift-F5       New users parameters"
  103.       PRINT "  Shift-F6       Library Sub-System"
  104.       PRINT "  Shift-F7       RBBS-PC Color parameters"
  105.       PRINT "  Shift-F8       Reserved for future use"
  106.       XX$ = "Press END to terminate or Function Key to select page for parameters shown "
  107.       GOSUB 50345
  108.       LOCATE ,,1
  109. 12310 GOSUB 22160
  110. 12320 IF IX THEN _            'IX    Key    Where to branch to
  111.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  112.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  113.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  114.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  115.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  116.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  117.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  118.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  119.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  120.                     12480, _  '10      F10 - RBBS-PC's utilities
  121.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  122.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  123.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  124.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  125.                     12520, _  '15 Shift-F5 - New user parameters
  126.                     12530, _  '16 Shift-F6 - Library parameters
  127.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  128.                     12310, _  '18 Shift-F8 - Reserved for future use
  129.                     12340, _  '19     PgUp - Go to previous page
  130.                     12330, _  '20     PgDn - Go to next page
  131.                     12630, _  '21      End - Terminate CONFIG
  132.                     12350     '22    Enter - Re-display current page
  133.       GOTO 12310
  134. '
  135. ' *  COMMON ROUTINE TO HANDLE UNDEFINED OPTIONS
  136. '
  137. 12325 IX = IPAGE
  138.       GOTO 12320
  139. '
  140. ' *  COMMON ROUTINE TO HANDLE PAGE UP OF DISPLAYS
  141. '
  142. 12330 IF (DISPLAYED.PAGE.NUMBER + 1 ) > 17 THEN _
  143.          GOTO 12190
  144.       IX = DISPLAYED.PAGE.NUMBER + 1
  145.       GOTO 12320
  146. '
  147. ' *  COMMON ROUTINE TO HANDLE PAGE DOWN OF DISPLAYS
  148. '
  149. 12340 IF (DISPLAYED.PAGE.NUMBER - 1) < 1 THEN _
  150.          GOTO 12190
  151.       IX = DISPLAYED.PAGE.NUMBER - 1
  152.       GOTO 12320
  153. '
  154. ' *  RETURN TO PRIMARY MENU SELECTION DISPLAY
  155. '
  156. 12350 GOSUB 60380
  157.       GOTO 12310
  158. '
  159. ' *  COMMON CONFIGURATION PROGRAM MENU AND PAGE DISPLAY
  160. '
  161. 12360 DISPLAYED.PAGE.NUMBER = 1
  162.       GOSUB 24800
  163.       LOCATE  3,1
  164.       PRINT " 1. SYSOP's Public First Name -------------------- " + SYSOP.FIRST.NAME$
  165.       PRINT " 2. SYSOP's Public Last Name --------------------- " + SYSOP.LAST.NAME$
  166.       PRINT " 3. SYSOP's default expert mode at signon -------- " + EXPERT.USER$
  167.       PRINT " 4. SYSOP's office hours -------------------------"STR$(START.OFFICE.HOURS);" to"STR$(END.OFFICE.HOURS)
  168.       PRINT " 5. Page SYSOP using printer's bell -------------- " + M11$
  169.       PRINT " 6. Go off-line whenever a DISK FULL occurs ------ " ; FNYESNO$(DISKFULL.GO.OFFLINE)
  170.       PRINT " 7. Prompt bell default is ----------------------- " + PROMPT.BELL$
  171.       PRINT " 8. Maximum time per session (in minutes) --------"STR$(MINUTES.PER.SESSION!)
  172.       PRINT " 9. Maximum minutes per day ----------------------";STR$(MAX.PER.DAY)
  173.       PRINT "10. Factor to extend session time for uploads ----" + STR$(UPLOAD.TIME.FACTOR!)
  174.       PRINT "11. # Months of inactivity before user deleted ---"STR$(ACT.MNTHS.B4.DELETING)
  175.       PRINT "12. Name of RBBS-PC shown initially is ----------- " + RBBS.NAME$
  176.       PRINT "13. Foreground color (for color monitors) is -----"STR$(FG)
  177.       PRINT "14. Background color (for color monitors) is -----"STR$(BG)
  178.       PRINT "15. The border color (for color monitors) is -----"STR$(BORDER)
  179.       PRINT "16. Your CONFIG.SYS contains 'DEVICE=ANSI.SYS'---- " + FNYESNO$(DOSANSI)
  180.       IF SMART.TEXT THEN _
  181.          SMART.TEXT$ = STR$(SMART.TEXT) _
  182.       ELSE SMART.TEXT$ = "<none>"
  183.       PRINT "17. Control character for SMART TEXT -------------" + SMART.TEXT$
  184.       PRINT "18. File with automatic operator page parameters - " ; AUTOPAGE.DEF$
  185.       X = INSTR("ANS",LOGON.MAIL.LEVEL$)
  186.       IF X < 1 THEN _
  187.          X = 1
  188.       X$ = MID$("OLD & NEWNEW ONLY NONE",9*X-8,9)
  189.       IF X$ = "NONE" THEN _
  190.          X$ = "<none>"
  191.       PRINT "19. Personal mail notification level at logon is - " + X$
  192.       GOTO 12580
  193. 12370 DISPLAYED.PAGE.NUMBER = 2
  194.       GOSUB 24800
  195.       LOCATE  3,1
  196.       PRINT "21. Remind users of messages that they left ------ " + FNYESNO$(MESSAGE.REMINDER)
  197.       PRINT "22. Remind users of # uploads and downloads? ----- " + FNYESNO$(REMIND.FILE.TRANSFERS)
  198.       PRINT "23. Remind users of their terminal profile? ------ " + FNYESNO$(REMIND.PROFILE)
  199.       PRINT "24. Enable download of new files at logon -------- " + FNYESNO$(NEW.FILES.CHECK)
  200.       PRINT "25. Default user page length is ------------------" + STR$(PAGE.LENGTH)
  201.       PRINT "26. Maximum number of lines allowed per message --" + STR$(MAX.MESSAGE.LINES)
  202.       PRINT "27. Is system 'welcome' interruptable? ----------- " + FNYESNO$(WELCOME.INTERRUPTABLE)
  203.       PRINT "28. Are system bulletins to be 'optional'? ------- " + FNYESNO$(BULLETINS.OPTIONAL)
  204.       PRINT "29. Type of PC RBBS-PC will be running on? ------- " + COMPUTER.TYPE$
  205.       PRINT "30. Symbols to use for SYSOP commands ------------ " + SYSOP.COMMANDS$
  206.       PRINT "31. Symbols to use for MAIN menu commands -------- " + MAIN.COMMANDS$
  207.       PRINT "32. Symbols to use for FILE menu commands -------- " + FILE.COMMANDS$
  208.       PRINT "33. Symbols to use for UTILITIES menu commands --- " + UTIL.COMMANDS$
  209.       PRINT "34. Symbols to use for global commands ----------- " + GLOBAL.COMMANDS$
  210.       PRINT "35. Show section in command prompt --------------- " + FNYESNO$(SHOW.SECTION)
  211.       PRINT "36. Show commands in command prompt -------------- " + FNYESNO$(COMMANDS.IN.PROMPT)
  212.       PRINT "37. Restrict valid commands to current section --- " + FNYESNO$(RESTRICT.VALID.CMDS)
  213.       PRINT "38. Use machine language routines for speed ------ " + FNYESNO$(TURBO.RBBS)
  214.       PRINT "39. Use BASIC PRINT for screen writes ------------ " + FNYESNO$(USE.BASIC.WRITES)
  215.       PRINT "40. # of lines for extended file descriptions ----" + STR$(MAX.EXTENDED.LINES)
  216.       GOTO 12580
  217. 12380 DISPLAYED.PAGE.NUMBER = 3
  218.       GOSUB 24800
  219.       LOCATE  3,1
  220.       PRINT "41. Field used to identify users ----------------- " + HASH.ID$
  221.       PRINT "42. Field used to distinguish users with same ID-- " + INDIV.ID$
  222.       PRINT "43. Start position identifying personal downloads-"  + STR$(PERSONAL.BEGIN)
  223.       PRINT "44. Field length to identify personal downloads --"  + STR$(PERSONAL.LEN)
  224.       PRINT "45. Prompt for first part of personal identifier - " + FIRST.NAME.PROMPT$
  225.       PRINT "46. Prompt for last part of personal identifier -- " + LAST.NAME.PROMPT$
  226.       PRINT "47. Enforce upload/download ratios --------------- " + FNYESNO$(ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
  227.       PRINT "48. RESTRICT users by SUBSCRIPTION date ---------- " + FNYESNO$(RESTRICT.BY.DATE)
  228.       PRINT "49. Security level when SUBSCRIPTION expires -----"  + STR$(EXPIRED.SECURITY)
  229.       PRINT "50. Days before expiration to warn callers -------"  + STR$(DAYS.TO.WARN)
  230.       PRINT "51. Default # days in SUBSCRIPTION PERIOD --------"  + STR$(DAYS.IN.SUBSCRIPTION.PERIOD)
  231.       PRINT "52. Turn printer off after each recycle ---------- " + FNYESNO$(TURN.PRINTER.OFF)
  232.       PRINT "53. Play musical themes for RBBS-PC functions----- " + FNYESNO$(MUSIC)
  233.       PRINT "54. BUFFER SIZE used when displaying text files --" + STR$(BUFFER.SIZE)
  234.       PRINT "55. Stack space to be made available -------------" + STR$(SIZE.OF.STACK)
  235.       PRINT "56. File shown users when SYSOP wants system next  " + NOT.YET.IN$ ' F7.MESSAGE$
  236.       PRINT "57. Ask users their (What is your ...) ----------- " + USER.LOCATION$
  237.       PRINT "58. Show ALL DIRECTORIES in order in dir of dir -- " + FNYESNO$(USE.DIR.ORDER)
  238.       PRINT "59. BUFFER SIZE for writes on internal protocols -" + STR$(WRITE.BUF.DEF)
  239.       PRINT "60. Voice Synthesizer support -------------------- " + VOICE.TYPE$
  240.       GOTO 12580
  241. 12390 DISPLAYED.PAGE.NUMBER = 4
  242.       GOSUB 24800
  243.       IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
  244.          DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + ":"
  245.       LOCATE  3,1
  246.       PRINT "61. Drive and file describing 'bulletins' is ----- " + DRIVE.FOR.BULLETINS$ + BULLETIN.MENU$
  247.       PRINT "62. Number of active 'bulletins' -----------------" + STR$(ACTIVE.BULLETINS)
  248.       PRINT "63. Prefix used to name bulletin files is -------- " + BULLETIN.PREFIX$
  249.       PRINT "64. Drive and path (optional) for 'help' files --- " + HELP.PATH$
  250.       PRINT "65. Prefix used to name three major 'help' files - " + HELP.FILE.PREFIX$
  251.       PRINT "66. Extension for help files of individual cmds -- " + HELP.EXTENSION$
  252.       PRINT "67. HELP file when callers CATEGORIZE uploads ---- " + UPCAT.HELP$
  253.       PRINT "68. Name of 'newuser' file shown to new users ---- " + NEWUSER.FILE$
  254.       PRINT "69. Name of 'welcome' file shown at logon -------- " + WELCOME.FILE$
  255.       PRINT "70. The SYSOP's command menu is named ------------ " + MENU$(1)
  256.       PRINT "71. The MAIN system menu is named ---------------- " + MENU$(2)
  257.       PRINT "72. The file subsystem menu is named ------------- " + MENU$(3)
  258.       PRINT "73. The utilities subsystem menu is named -------- " + MENU$(4)
  259.       PRINT "74. Menu that lists available conferences is ----- " + CONFERENCE.MENU$
  260.       PRINT "75. Menu that lists questionnaires available is -- " + ANS.MENU$
  261.       PRINT "76. Drive/path for optional questionnaires ------- " + QUES.PATH$
  262.       PRINT "77. File with main SYSOP-supplied user interface - " + MAIN.PUI$
  263.       PRINT "78. Allow menus to pause in the middle ----------- " + FNYESNO$(MENUS.CAN.PAUSE)
  264.       PRINT "79. Drive/path where macro files are stored ------ " + MACRO.DRVPATH$
  265.       IF MACRO.EXTENSION$ = "" THEN _                                ' KG060701
  266.          X$ = NONE.PICKED$ _                                         ' KG060701
  267.       ELSE X$ = MACRO.EXTENSION$                                     ' KG060701
  268.       PRINT "80. Extension of macro files --------------------- " ; X$ ' KG060701
  269.       GOTO 12580
  270. 12400 DISPLAYED.PAGE.NUMBER = 5
  271.       GOSUB 24800
  272.       LOCATE  3,1
  273.       PRINT " 81. File containing invalid user names ----------- " + TRASHCAN.FILE$
  274.       PRINT " 82. Name questionnaire required of ALL callers --- " + REQUIRED.QUESTIONNAIRE$
  275.       PRINT " 83. Name of 'pre-log' file ----------------------- " + PRELOG$
  276.       PRINT " 84. Name of questionnaire required of new users -- " + NEW.USER.QUESTIONNAIRE$
  277.       PRINT " 85. Name of 'epi-log' questionnaire -------------- " + EPILOG$
  278.       PRINT " 86. System file containing messages is named ----- " + MAIN.MESSAGE.FILE$
  279.       PRINT " 87. System file for recording users is named ----- " + MAIN.USER.FILE$
  280.       PRINT " 88. System file for comments to SYSOP is named --- " + COMMENTS.FILE$
  281.       PRINT " 89. Record comments as private messages ---------- " ; FNYESNO$(COMMENTS.AS.MESSAGES)
  282.       PRINT " 90. System file for 'callers' is named ----------- " + CALLERS.FILE$
  283.       PRINT " 91. Extended logging to 'callers' file ----------- " ; FNYESNO$(EXTENDED.LOGGING)
  284.       PRINT " 92. Wrap-around the 'callers' file --------------- " + NOT.YET.IN$ ' WRAP.CALLERS.FILE$
  285.       PRINT " 93. File controlling scan for mail waiting ------- " + CONFMAIL.LIST$
  286.       PRINT " 94. Max # of work variables in ques/macros -------"  ; STR$(MAX.WORK.VAR)
  287.       GOTO 12580
  288. 12410 DISPLAYED.PAGE.NUMBER = 6
  289.       GOSUB 24800
  290.       LOCATE  3,1
  291.       PRINT "101. Is the 'door' subystem available? ------------ " ; FNYESNO$(DOORS.AVAILABLE)
  292.       PRINT "102. The 'door' subsystem menu is named ----------- " + MENU$(5)
  293.       PRINT "103. File built dynamically to open a 'door' ------ " + RCTTY.BAT$
  294.       PRINT "104. When a 'door' closes, re-invoke RBBS-PC via -- " + RBBS.BAT$
  295.       PRINT "105. Drive/path to look for COMMAND.COM on -------- " + DISK.FOR.DOS$
  296.       PRINT "106. Use the Dos 'CTTY' command to redirect I/O --- " ; FNYESNO$(REDIRECT.IO.METHOD)
  297.       PRINT "107. Door Program to check users at logon --------- " ; REGISTRATION.PROGRAM$
  298.       PRINT "108. Logon door required of new users & security <="  ; STR$(MAX.REG.SEC)
  299.       PRINT "109. Name of control file for doors --------------- " ; DOORS.DEF$
  300.       GOTO 12580
  301. 12420 DISPLAYED.PAGE.NUMBER = 7
  302.       GOSUB 24800
  303.       LOCATE  3,1
  304.       PRINT "121. Pseudonym to sign on remotely as the SYSOP ---- " + MN1$+ " " +MN2$
  305.       PRINT "122. ESC key logs SYSOP on locally without password- " + FNYESNO$(ESCAPE.INSECURE)
  306.       PRINT "123. Minimum security level to log on RBBS-PC ------" + STR$(MINIMUM.LOGON.SECURITY)
  307.       PRINT "124. Default security level for new callers --------" + STR$(DEFAULT.SECURITY.LEVEL)
  308.       PRINT "125. Security level for SYSOP ----------------------" + STR$(SYSOP.SECURITY.LEVEL)
  309.       PRINT "126. Minimum security level to see SYSOP's menu ----" + STR$(SYSOP.MENU.SECURITY.LEVEL)
  310.       PRINT "127. Minimum security to leave extended description-" + STR$(ASK.EXTENDED.DESC)
  311.       PRINT "128. Max # security violations before disconnect ---" + STR$(MAXIMUM.VIOLATIONS)
  312.       M22$ = STR$(SYSOP.FUNCTION(1))
  313.       IX = SYSOP.FUNCTION(1)
  314.       FOR I = 2 TO NUM.SYSOP
  315.         IF IX <> SYSOP.FUNCTION(I) THEN _
  316.            M22$ = "(Variable)" : _
  317.            GOTO 12430
  318.       NEXT
  319. 12430 PRINT "129. Security level for SYSOP functions ------------" + M22$
  320.       M23$ = STR$(MAIN.FUNCTION(1))
  321.       IX = MAIN.FUNCTION(1)
  322.       FOR I = 2 TO NUM.MAIN
  323.         IF IX<>MAIN.FUNCTION(I) THEN _
  324.            M23$ = "(Variable)" : _
  325.            GOTO 12440
  326.       NEXT
  327. 12440 PRINT "130. Security level for main menu functions --------" + M23$
  328.       M24$ = STR$(FILES.FUNCTION(1))
  329.       IX = FILES.FUNCTION(1)
  330.       FOR I = 2 TO NUM.FILES
  331.         IF IX<>FILES.FUNCTION(I) THEN _
  332.            M24$ = "(Variable)" : _
  333.            GOTO 12450
  334.       NEXT
  335. 12450 PRINT "131. Security level for file menu functions --------" + M24$
  336.       M25$ = STR$(UTILITY.FUNCTION(1))
  337.       IX = UTILITY.FUNCTION(1)
  338.       FOR I = 2 TO NUM.UTILITY
  339.         IF IX<>UTILITY.FUNCTION(I) THEN _
  340.            M25$ = "(Variable)" : _
  341.            GOTO 12460
  342.       NEXT
  343. 12460 PRINT "132. Security level for utilities menu functions ---" + M25$
  344.       M26$ = STR$(GLOBAL.FUNCTION(1))
  345.       IX = GLOBAL.FUNCTION(1)
  346.       FOR I = 1 TO NUM.GLOBAL
  347.         IF IX<>GLOBAL.FUNCTION(I) THEN _
  348.            M26$ = "(Variable)" : _
  349.            GOTO 12465
  350.       NEXT
  351. 12465 PRINT "133. Security level for GLOBAL commands ------------" + M26$
  352.       PRINT "134. Max # of password changes in a session --------" + STR$(MAXIMUM.PASSWORD.CHANGES)
  353.       PRINT "135. Minimun security for temp. password changes ---" + STR$(MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
  354.       PRINT "136. Minimum security to overwrite on uploads ------" + STR$(OVERWRITE.SECURITY.LEVEL)
  355.       PRINT "137. User's security exempted from 'packing' -------" + STR$(SEC.LVL.EXEMPT.FRM.PURGING)
  356.       PRINT "138. Default security to read new PRIVATE messages -"  + STR$(PRIVATE.READ.SEC)
  357.       PRINT "139. Default security to read new PUBLIC messages --"  + STR$(PUBLIC.READ.SEC)
  358.       PRINT "140. Minimum security to change msg.'s security ----"  + STR$(SEC.CHANGE.MSG)
  359.       GOTO 12580
  360. 12466 DISPLAYED.PAGE.NUMBER = 8
  361.       GOSUB 24800
  362.       LOCATE  3,1
  363.       PRINT "141. Call-back verification ----------------------- " + NOT.YET.IN$ ' CALLBACK.VERIFICATION$
  364.       PRINT "142. Drive/path where personal files & dir stored - " + PERSONAL.DRVPATH$
  365.       PRINT "143. Name of Personal Directory ------------------- " + PERSONAL.DIR$
  366.       PRINT "144. Protocol required for personal downloads ----- " + MID$("<none>  Ascii  XMODEM Xm/CRC Kermit Ymodem Imodem YmodemGWxmodem", 7 * INSTR("NAXCKYIGW",PERSONAL.PROTOCOL$) - 6,7)
  367.       PRINT "145. Files with download security are listed in --- " + FILESEC.FILE$
  368.       PRINT "146. File name with privileged group passwords is - " + PASSWORD.FILE$
  369.       PRINT "147. Concatenate multi-file ASCII downloads ------- " + FNYESNO$(PERSONAL.CONCAT)
  370.       PRINT "148. Min SECURITY to CATEGORIZE uploads -----------" + STR$(SL.CATEGORIZE.UPLOADS)
  371.       PRINT "149. Min security level to view new uploads -------" + STR$(MIN.SEC.TO.VIEW)
  372.       PRINT "150. Security level exempt from 'epi-log' file ----" + STR$(SECURITY.EXEMPT.FROM.EPILOG)
  373.       PRINT "151. Min. security to 'AUTO ADD' conference user --" + AUTO.ADD.SECURITY$
  374.       PRINT "152. Min. security for old caller to turbo logon --" + STR$(ALLOW.CALLER.TURBO)
  375.       PRINT "153. Min. security to describe an existing file ---" + STR$(ADD.DIR.SECURITY)
  376.       PRINT "154. Help file to display for a security violation- " + SECVIO.HLP$
  377.       TIME.LOCK$ = MID$("<none> DOORS  DOWNLDSBOTH   ",TIME.LOCK*7+1,7)
  378.       PRINT "155. Time lock on DOORS and DOWNLOADS ------------- "; TIME.LOCK$
  379.       PRINT "156. Min. sec level exempt from auto-update of sec-" ; AUTO.UPGRADE.SEC
  380.       PRINT "157. Min security to READ & KILL all messages -----" ; SEC.KILL.ANY
  381.       PRINT "158. Do not display messages beginning with ------- "; SCREEN.OUT.MSG$
  382.       GOTO 12580
  383. 12470 DISPLAYED.PAGE.NUMBER = 9
  384.       GOSUB 30040
  385.       ' MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
  386.       MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
  387.       MAX.ALLOWED.MSGS.FRM.DEF  = MAXIMUM.NUMBER.OF.MSGS
  388.       GOSUB 24800
  389.       LOCATE  3,1
  390.       PRINT "161. Maximum number of concurrent RBBS-PC's  -------" + STR$(MAXIMUM.NUMBER.OF.NODES)
  391.       MT$ = "single RBBS-PC copy "
  392.       IF MAXIMUM.NUMBER.OF.NODES <> 1 THEN _
  393.          MT$ = "concurrent RBBS-PC's" : _
  394.          SUBROUTINE.PARAMETER = 2 : _
  395.          IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  396.             SUBROUTINE.PARAMETER = 1 : _
  397.             CALL NETTYPE : _
  398.          ELSE CALL NETTYPE
  399.       IF NETWORK.TYPE = 6 THEN _
  400.          MT$ = "NETBIOS             "
  401.       IF NETWORK.TYPE = 7 THEN _
  402.          MT$ = "DoubleDOS           "
  403.       PRINT "162. Environment running " + MT$ + " ------ " + NETWORK.TYPE$
  404.       PRINT "163. RBBS-PC 'recycle' method when users log off --- " + RECYCLE.TO.DOS$
  405.       FILE$ = MAIN.MESSAGE.FILE$
  406.       GOSUB 30180
  407.       MAX.MSG.FILE.SIZE.FRM.DEF! = UG
  408.       PRINT "164. Number of records in the User File ------------";STR$(MAX.USR.FILE.SIZE.FRM.DEF)
  409.       PRINT "165. Number of records in the Message File ---------";STR$(MAX.MSG.FILE.SIZE.FRM.DEF!) ' KG060303
  410.       PRINT "166. Maximum number of messages allowed ------------" + STR$(MAX.ALLOWED.MSGS.FRM.DEF)
  411.       PRINT "167. Conference File Maintenance."
  412.       PRINT "168. Default extension for compressed files -------- " ; DEFAULT.EXTENSION$
  413.       PRINT "169. Message file GROWS in size as messages added -- " ; FNYESNO$(MESSAGES.CAN.GROW)
  414.       GOTO 12580
  415. 12480 DISPLAYED.PAGE.NUMBER = 10
  416.       GOSUB 24800
  417.       RB = 0
  418.       LOCATE  3,1
  419.       PRINT "181. Pack " + MAIN.MESSAGE.FILE$ + " file.
  420.       PRINT "182. Rebuild " + MAIN.USER.FILE$ + " file.
  421.       PRINT "183. Print " + MAIN.MESSAGE.FILE$ + " 'header' records.
  422.       PRINT "184. Renumber messages in " + MAIN.MESSAGE.FILE$ + " file.
  423.       PRINT "185. Repair messages in " + MAIN.MESSAGE.FILE$ + " file.
  424.       PRINT "186. Make all users answer required questionnaire."
  425.       PRINT "187. Check FMS directory structure."
  426.       PRINT "188. Check Personal Download directory structure."
  427.       PRINT "189. Set most critical parameters."
  428.       PRINT "190. Set parameters new to RBBS-PC " + CONFIG.VERSION$
  429.       PRINT "191. Reset active printers for all nodes."
  430.       PRINT "192. Make user pref. on hilighting match color graphics."
  431.       GOTO 12580
  432. 12490 DISPLAYED.PAGE.NUMBER = 11
  433.       GOSUB 24800
  434.       LOCATE  3,1
  435.       PRINT "201. Drive available for uploading files to ------- " + DRIVE.FOR.UPLOADS$ + ":"
  436.       PRINT "202. File name of Upload Directory  --------------- " + UPLOAD.DIRECTORY$
  437.       PRINT "203. Drive/path where Upload Directory stored ----- " + UPLOAD.PATH$
  438.       PRINT "204. Drive(s) available for Downloading ----------- " + DRIVES.FOR.DOWNLOADS$
  439.       PRINT "205. Will you be using DOS sub-directories? ------- " ; FNYESNO$(WILL.SUBDIRS.B.USED)
  440.       PRINT "206. Write Uploads to a DOS sub-directory? -------- " + FNYESNO$(UPLOAD.TO.SUBDIR)
  441.       PRINT "207. Are downloads from DOS sub-directories? ------ " + FNYESNO$(DOWNLOAD.TO.SUBDIR)
  442.       PRINT "208. List, change, add, delete sub-directories."
  443.       PRINT "209. Extension for file directories --------------- " + DIRECTORY.EXTENTION$
  444.       X$ = ALTDIR.EXTENSION$
  445.       IF ALTDIR.EXTENSION$ = "" OR _
  446.          ALTDIR.EXTENSION$ = "<none>" THEN _
  447.          X$ = NONE.PICKED$
  448.       PRINT "210. Alternate extension for directory files ------ " + X$
  449.       PRINT "211. Name (prefix) of directory of directories ---- " + DIRECTORY.PREFIX$
  450.       PRINT "212. Omit directory of directories in N)ew cmnd. -- " + OMIT.MAIN.DIRECTORY$
  451.       X$ = ALWAYS.STREW.TO$
  452.       IF ALWAYS.STREW.TO$ = "" OR _
  453.          ALWAYS.STREW.TO$ = "<none>" THEN _
  454.          X$ = "NO"
  455.       PRINT "213. Copy all upload descriptions to -------------- " + X$
  456.       A$ = FMS.DIRECTORY$
  457.       IF FMS.DIRECTORY$ = "" THEN _
  458.          A$ = NONE.PICKED$
  459.       PRINT "214. Name of master File Management System dir is - " + A$
  460.       PRINT "215. Limit file searches to master FMS dir only --- " ; FNYESNO$(LIMIT.SEARCH.TO.FMS)
  461.       PRINT "216. Default category code for uploads ------------ " + DEFAULT.CATEGORY.CODE$
  462.       PRINT "217. File containing valid directory categories --- " + DIR.CATEGORY.FILE$
  463.       X$ = MASTER.DIRECTORY.NAME$
  464.       IF MASTER.DIRECTORY.NAME$ = "" THEN _
  465.          X$ = "NO"
  466.       PRINT "218. Limit search for 'ALL' dirs to directory ----- " + X$
  467.       PRINT "219. Max length of description of uploaded file ---" + STR$(MAX.DESC.LEN)
  468.       PRINT "220. Drive/path(optional) for directory files ----- " + DIRECTORY.PATH$
  469.       GOTO 12580
  470. 12500 DISPLAYED.PAGE.NUMBER = 12
  471.       GOSUB 24800
  472.       LOCATE 3,1
  473.       PRINT "221. Communications port to be used by RBBS-PC ----" + COM.PORT$
  474.       PRINT "222. # of seconds to wait for modem to initialize -" + STR$(MODEM.INIT.WAIT.TIME)
  475.       PRINT "223. Seconds to wait before issuing modem commands-" + STR$(MODEM.COMMAND.DELAY.TIME)
  476.       PRINT "224. Number of rings to wait before answering -----" + STR$(REQUIRED.RINGS);
  477.       IF INSTR(USER.INIT.COMMAND$, "S0=255 ") > 0 THEN _
  478.          PRINT " RING BACK";
  479.       PRINT "225. Use the RBBS-PC default Hayes commands? ------ " + M14$
  480.       PRINT "226. ---------------------------------------------- "
  481.       PRINT "227. Issue modem commands between rings ----------- " ; FNYESNO$(COMMANDS.BETWEEN.RINGS)
  482.       PRINT "228. Baud rate to initially open modem at --------- " + MODEM.INIT.BAUD$
  483.       X$ = STR$(WAIT.BEFORE.DISCONNECT) + " seconds"
  484.       IF WAIT.BEFORE.DISCONNECT = 0 THEN _
  485.          X$ = "NO"
  486.       PRINT "229. Log off user who are idle for ----------------" + X$
  487.       PRINT "230. Are you using a 'DUMB' auto-answer modem? ---- " ; FNYESNO$(DUMB.MODEM)
  488.       PRINT "231. Initialize modem firmware for RBBS-PC."
  489.       PRINT "232. # seconds to wait after dropping DTR ---------"  + STR$(DTR.DROP.DELAY)
  490.       PRINT "233. File with PROTOCOL definitions --------------- " + PROTO.DEF$
  491.       PRINT "234. Always check caller for AUTODOWNLOAD support - " ; FNYESNO$(ASK.IDENTITY)
  492.       PRINT "235. Require non-ascii protocol for BASIC files --- " ; FNYESNO$(REQUIRE.NON.ASCII)
  493.       X$ = STR$(RECYCLE.WAIT) + " minutes"
  494.       IF RECYCLE.WAIT = 0 THEN _
  495.          X$ = "<Don't recycle>"
  496.       PRINT "236. Recycle if no calls are received within ------" + X$
  497.       PRINT "237. Leave modem at initial baud ------------------ " + MID$("YES NO  HIGH",(4*KEEP.INIT.BAUD)+5,4) ' WM042201
  498.       GOTO 12580
  499. 12505 DISPLAYED.PAGE.NUMBER = 13
  500.       GOSUB 24800
  501.       LOCATE 3,1
  502.       PRINT "241. Restore initial parms. after change to N/8/1 - " + FNYESNO$(SWITCH.BACK)
  503.       PRINT "242. Minimum baud required of new callers ---------"  + STR$(MIN.NEWCALLER.BAUD)
  504.       PRINT "243. Minimum baud required of old callers ---------"  + STR$(MIN.OLDCALLER.BAUD)
  505.       PRINT "244. Modem flow control uses Clear-to-Send (CTS)--- " + RTS$
  506.       PRINT "245. Modem flow control uses XON/XOFF ------------- " + FNYESNO$(XON.XOFF)
  507.       PRINT "246. Seconds to wait for carrier after answering --"  + STR$(MAX.CARRIER.WAIT)
  508.       GOTO 12580
  509. 12510 DISPLAYED.PAGE.NUMBER = 14
  510.       GOSUB 24800
  511.       LOCATE 3,1
  512.       TIME.TO.DROP.TO.DOS$ = "<none>"
  513.       IF TIME.TO.DROP.TO.DOS > 0 THEN _
  514.          TIME.TO.DROP.TO.DOS$ = STRING$(4 - (LEN(STR$(TIME.TO.DROP.TO.DOS)) - 1),"0") + MID$(STR$(TIME.TO.DROP.TO.DOS),2)
  515. 12512 PRINT "261. Time of day to exit to DOS ------------------- " + TIME.TO.DROP.TO.DOS$
  516.       PRINT "262. Net mail to invoke is ------------------------ " + NET.MAIL$
  517.       X$ = HOST.ECHO.ON$
  518.       IF HOST.ECHO.ON$ = "" THEN _
  519.          X$ = NONE.PICKED$
  520.       PRINT "263. Command for intermediate host to ECHO -------- " + X$
  521.       X$ = HOST.ECHO.OFF$
  522.       IF HOST.ECHO.OFF$ = "" THEN _
  523.          X$ = NONE.PICKED$
  524.       PRINT "264. Command for intermediate host NOT to ECHO ---- " + X$
  525.       X = INSTR("ICR",DEFAULT.ECHOER$)
  526.       X$ = MID$("Intermediate hostCaller's softwareRBBS-PC",1 + 17 * (X - 1),17)
  527.       PRINT "265. Who echos what a remote caller types? -------- " + X$
  528.       X$ = DEFAULT.LINE.ACK$
  529.       IF DEFAULT.LINE.ACK$ = "" THEN _
  530.          X$ = NONE.PICKED$
  531.       PRINT "266. String to acknowlege line in ASCII upload ---- "+ X$
  532.       GOTO 12580
  533. 12520 DISPLAYED.PAGE.NUMBER = 15
  534.       GOSUB 24800
  535.       LOCATE  3,1
  536.       PRINT "281. Let new users set their preferences --------- " ; FNYESNO$(NEWUSER.SETS.DEFAULTS)
  537.       PRINT "282. New users default sign-on mode -------------- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.MODE$
  538.       PRINT "283. New users default file-transfer protocol ---- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.PROTOCOL$
  539.       PRINT "284. Line feeds for new users default to --------- " + NOT.YET.IN$ ' NEW.USER.LINE.FEEDS$
  540.       PRINT "285. Work DRIVE and SUBDIR for View feature------- " + ARKVIEW.PATH$ 'VIEWARC MOD
  541.       PRINT "286. Prompt bell for new users defaults to ------- " + NOT.YET.IN$ ' NEW.USER.BELL$
  542.       PRINT "287. New users 'graphics' capability is assumed -- " + NOT.YET.IN$ ' NEW.USER.GRAPHICS$
  543.       PRINT "288. New users are assumed UPPERCASE only -------- " + NOT.YET.IN$ ' NEW.USER.CASE$
  544.       PRINT "289. New users message margins defaults to ------- " + NOT.YET.IN$ ' STR$(NEW.USER.MARGINS)
  545.       PRINT "290. Add new users to USERS file ----------------- " ; FNYESNO$(REMEMBER.NEW.USERS)
  546.       PRINT "291. Let new users on even when USERS file full -- " ; FNYESNO$(SURVIVE.NOUSER.ROOM)
  547.       GOTO 12580
  548. 12530 DISPLAYED.PAGE.NUMBER = 16
  549.       GOSUB 24800
  550.       LOCATE  3,1
  551.       X$ = LIBRARY.DRIVE$
  552.       IF LIBRARY.DRIVE$ = "" THEN _
  553.          X$ = NONE.PICKED$
  554.       PRINT "301. Library drive ------------------------------- " + X$
  555.       PRINT "302. Drive/Path for Library directory ------------ " + LIBRARY.DIRECTORY.PATH$
  556.       PRINT "303. Extension for Library directory ------------- " + LIBRARY.DIRECTORY.EXTENTION$
  557.       PRINT "304. Drive/Path for Library work/RAM disk -------- " + LIBRARY.WORK.DISK.PATH$
  558.       PRINT "305. # of disks in Library -----------------------" + STR$(LIBRARY.MAX.DISK)
  559.       PRINT "306. # of master Library subdirectories ----------" + STR$(LIBRARY.MAX.DIRECTORY)
  560.       PRINT "307. # of subdirectories in each master ----------" + STR$(LIBRARY.MAX.SUBDIR)
  561.       PRINT "308. Prefix of Library subdirectories ------------ " + LIBRARY.SUBDIR.PREFIX$
  562.       PRINT "309. Name of Library subsystem command menu ------ " + MENU$(6)
  563.       PRINT "310. Symbols to use for Library menu commands ---- " + LIBRARY.COMMANDS$
  564.       M27$ = STR$(PS)
  565.       IX = LIBRARY.FUNCTION(1)
  566.       FOR I = 1 TO NUM.LIBRARY
  567.          IF IX<>LIBRARY.FUNCTION(I) THEN _
  568.             M27$ = "(Variable)" : _
  569.             GOTO 12531
  570.       NEXT
  571. 12531 PRINT "311. Security level for Library menu functions --- " + M27$
  572.       PRINT "312. Drive/Path of archive utility --------------- " + LIBRARY.ARCHIVE.PATH$
  573.       PRINT "313. Name of executable archive utility ---------- " + LIBRARY.ARCHIVE.PROGRAM$
  574.       GOTO 12580
  575. 12540 DISPLAYED.PAGE.NUMBER = 17
  576.       GOSUB 24800
  577.       LOCATE  3,1
  578.       X$ = EMPHASIZE.ON.DEF$
  579.       IF EMPHASIZE.ON.DEF$ = "" THEN _
  580.          X$ = NONE.PICKED$
  581.       PRINT "321. String to turn ON Graphic Emphasis ----------- " + X$
  582.       X$ = EMPHASIZE.OFF.DEF$
  583.       IF EMPHASIZE.OFF.DEF$ = "" THEN _
  584.          X$ = NONE.PICKED$
  585.       PRINT "322. String to restore normal text (Emphasis OFF) - " + X$
  586.       PRINT "323. Caller's Foreground color 1 ------------------ " + FG.1.DEF$
  587.       PRINT "324. Caller's Foreground color 2 ------------------ " + FG.2.DEF$
  588.       PRINT "325. Caller's Foreground color 3 ------------------ " + FG.3.DEF$
  589.       PRINT "326. Caller's Foreground color 4 ------------------ " + FG.4.DEF$
  590.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",CALLER.BKGRD*6+1,6)
  591.       PRINT "327. Caller's Background color -------------------- " ; X$
  592.       GOTO 12580
  593. 12550 DISPLAYED.PAGE.NUMBER = 18
  594.       GOSUB 24800
  595.       GOTO 12580
  596. 12580 IF PRE.DISPLAY THEN _
  597.          PRE.DISPLAY = FALSE : _
  598.          GOTO 12622
  599.       GOSUB 24890
  600. 12590 GOSUB 22160
  601. 12592 IF IX THEN _            'IX       Key    Where to branch to
  602.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  603.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  604.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  605.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  606.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  607.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  608.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  609.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  610.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  611.                     12480, _  '10      F10 - RBBS-PC's utilities
  612.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  613.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  614.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  615.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  616.                     12520, _  '15 Shift-F5 - New user parameters
  617.                     12530, _  '16 Shift-F6 - Library parameters
  618.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  619.                     12310, _  '18 Shift-F8 - Reserved for future use
  620.                     12340, _  '19     PgUp - Go to previous page
  621.                     12330, _  '20     PgDn - Go to next page
  622.                     12630, _  '21      End - Terminate CONFIG
  623.                     12620     '22 Enter - Option selected followed by "enter"
  624.       GOTO 12590
  625. 12620 GOSUB 50340
  626.       IF VAL(HJ$) < 1 OR VAL(HJ$) > 331 THEN _
  627.          GOTO 12580
  628.       IPAGE = INT((VAL(HJ$) - 1) / 20)
  629.       IF DISPLAYED.PAGE.NUMBER <> IPAGE+1 THEN _
  630.          PRE.DISPLAY = TRUE : _
  631.          IX = IPAGE+1 : _
  632.          GOTO 12592
  633. 12622 ILOOKUP = VAL(HJ$) - (20 * IPAGE)
  634.       IPAGE = IPAGE + 1
  635.       IF ILOOKUP < 1 THEN _
  636.          ILOOKUP = 20 : _
  637.          IPAGE = IPAGE - 1
  638. 12630 EXIT SUB
  639. '
  640. ' * COMMON SUBROUTINE TO HANDLE THE FUNCTION KEYS, SCROLL BETWEEN CONFIG'S
  641. ' * PAGES OF OPTIONS, AND USER'S SELECTING A NUMERIC 4-CHARACTER OPTION.
  642. '
  643. 22160 I! = FRE(C$)
  644.       IX = 0
  645.       IF KSTACKED$ = "" THEN _
  646.          GOTO 22161
  647.       X = INSTR(KSTACKED$,CHR$(13))
  648.       IF X > 0 THEN _
  649.          IX = 22 : _
  650.          HJ$ = LEFT$(KSTACKED$,X-1) : _
  651.          KSTACKED$ = RIGHT$(KSTACKED$,LEN(KSTACKED$)-X) : _
  652.          OPTION$ = HJ$ : _
  653.          RETURN
  654.       Y$ = CHR$(0) + CHR$(68)
  655.       IF KSTACKED$ = "END" THEN _
  656.          Y$ = CHR$(0) + CHR$(79)
  657.       KSTACKED$ = ""
  658.       GOTO 22240
  659. 22161 Y$ = INKEY$
  660.       IF LEN(Y$) < 1 THEN _
  661.          GOTO 22161
  662.       IF LEN(Y$) = 2 THEN _               ' IF A FUNCTION KEY, BRANCH
  663.          GOTO 22240
  664.       IF ASC(Y$) = 13 THEN _              ' IF A CARRIAGE RETURN, RETURN
  665.          IX = 22 : _
  666.          RETURN
  667.       IF ASC(Y$) = 8 AND LEN(HJ$) > 0 THEN _
  668.          HJ$ = LEFT$(HJ$,LEN(HJ$) - 1) : _
  669.          PRINT CHR$(29) + " " + CHR$(29); : _
  670.          GOTO 22161
  671.       IF ASC(Y$) < 48 OR ASC(Y$) > 57 THEN _
  672.          GOTO 22161
  673.       PRINT Y$;
  674.       HJ$ = HJ$ + _
  675.             Y$
  676.       OPTION$ = HJ$
  677.       IF LEN(HJ$) > 4 THEN _              ' IF MORE THAN FOUR CHARACTERS,
  678.          IX = 22                          ' RETURN
  679.       RETURN
  680. '
  681. ' * COMMON SUBROUTINE TO HANDLE SET UP RETURN CODES FOR FUNCTION KEYS THAT
  682. ' * WERE PRESSED ON THE LOCAL PC RUNNING CONFIG
  683. '
  684. 22240 IX = ASC(RIGHT$(Y$,1))
  685.       IF IX < 59 OR IX > 91 THEN _        ' IGNORE IF NOT F1 THROUGH F10 OR
  686.          IX = 0: _                        ' SHIFT-F1 THROUGH SHIFT-F8
  687.          RETURN
  688.       IF IX = 73 THEN _                   ' IF PGUP THEN SET IX = 19
  689.          IX = 19 : _
  690.          RETURN
  691.       IF IX = 79 THEN _                   ' IF END THEN SET IX = 21
  692.          IX = 21 : _
  693.          RETURN
  694.       IF IX = 81 THEN _                   ' IF PGDN THEN SET IX = 20
  695.          IX = 20 : _
  696.          RETURN
  697.       IF (IX-58) < 11 THEN _              ' IF F1 THROUGH F10 SET IX = 1
  698.          IX = IX - 58 : _                 ' THROUGH 10 ACCORDINGLY.
  699.          RETURN
  700.       IF (IX-73) > 10 AND _               ' IF SHIFT-F1 THROUGH SHIFT-F8 THEN
  701.          (IX-73) < 19 THEN _              ' SET IX = 11 THROUGH 18
  702.             IX = IX - 73 : _              ' ACCORDINGLY.
  703.             RETURN
  704.       IX = 0
  705.       RETURN
  706. '
  707. ' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
  708. '
  709. 24800 CLS
  710.       I! = FRE(C$)
  711.       COLOR 0,7,0
  712.       LOCATE 1,10
  713.       PRINT "RBBS-PC " + CONFIG.VERSION$ + " Configuration ";
  714.       IF CONFERENCE.MODE THEN _
  715.          GOSUB 24970
  716.       COLOR FG,BG,BORDER
  717.       PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
  718.       RETURN
  719. 24890 A$ = "Enter parameter # to change, END to update, PgUp/PgDn to scroll:"
  720. 24900 LOCATE 24,5
  721.       PRINT A$;
  722.       X = POS(0) + 2
  723.       PRINT STRING$((75 - LEN(A$)),32);
  724.       LOCATE 24,X
  725.       COLOR FG,BG,BORDER
  726.       HJ$ = "
  727.       I! = FRE(C$)
  728.       RETURN
  729. '
  730. ' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
  731. '
  732. 24970 LOCATE 2,1
  733.       PRINT SPACE$(10)
  734.       LOCATE 2,10
  735.       A$ = "Private"
  736.       IF CONFERENCE.MODE = 2 THEN _
  737.          A$ = "Public"
  738.       PRINT "(" + A$ + " Conference Maintenance Mode for " + _
  739.             MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF")-1) + _
  740.             ")";
  741.       RETURN
  742. '
  743. ' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
  744. '
  745. 30040 IF NETWORK.TYPE = 6 THEN _
  746.          OPEN MAIN.MESSAGE.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  747.       ELSE OPEN "R",2,MAIN.MESSAGE.FILE$,128
  748.       FIELD 2,128 AS RR$
  749.       GET 2,1
  750.       CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8  =  number of last message on system
  751.       FIRST.USER.RECORD = VAL(MID$(RR$,52,5))        ' 52- 56  =  first rec. of user file
  752.       CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61  =  next avail. user record
  753.       HIGHEST.USER.RECORD = VAL(MID$(RR$,62,5))      ' 62- 66  =  last rec. of user file
  754.       FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
  755.       NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
  756.       HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
  757.       MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
  758.       MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
  759.       CLOSE 2
  760.       RETURN
  761. '
  762. ' * COMMON ROUTINE TO GET THE LENGTH OF A FILE
  763. '
  764. 30180 IF NETWORK.TYPE = 6 THEN _
  765.          OPEN FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  766.       ELSE OPEN "R",2,FILE$,128
  767.       FIELD 2,128 AS RR$
  768.       UG = LOF(2) / 128
  769.       CLOSE 2
  770.       RETURN
  771. '
  772. ' * COMMON SUBROUTINE TO KEEP STRING SPACE CLEAN AND CLEAR LINE 24
  773. '
  774. 50340 I! = FRE(C$)
  775.       LOCATE 24,1
  776.       PRINT STRING$(79,32);
  777.       RETURN
  778. '
  779. ' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
  780. '
  781. 50345 GOSUB 50340
  782.       LOCATE 24,5
  783.       PRINT XX$;
  784.       RETURN
  785. '
  786. ' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
  787. '
  788. 60380 FOR I = 1 TO 3
  789.         BEEP
  790.       NEXT
  791.       RETURN
  792.       END SUB
  793. '  $SUBTITLE: 'NETTYPE - subroutine to select supported networks'
  794. '  $PAGE
  795. '
  796. '  SUBROUTINE NAME    --  NETTYPE
  797. '
  798. '  INPUT PARAMETERS   --  MLCOM
  799. '                         NETWORK.TYPE
  800. '                         NETWORK.TYPE$
  801. '                         SUBROUTINE.PARAMETER
  802. '
  803. '  OUTPUT PARAMETERS  --  MLCOM
  804. '                         NETWORK.TYPE
  805. '                         NETWORK.TYPE$
  806. '
  807. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED NETWORKS
  808. '
  809.       SUB NETTYPE STATIC
  810.       ON SUBROUTINE.PARAMETER GOTO 60382,60384
  811. 60382 CLS
  812.       LOCATE 3,1
  813.       PRINT "     RBBS-PC is supported in the following:"
  814.       PRINT "                   Environment"
  815.       PRINT "          0. Single RBBS-PC in an IBM DOS environment"
  816.       PRINT "          1. MultiLink (multi-tasking under single DOS)"
  817.       PRINT "          2. Omninet (CORVUS)"
  818.       PRINT "          3. PC-NET (Orchid)"
  819.       PRINT "          4. DESQview (Quarterdeck)"
  820.       PRINT "          5. 10 NET (Fox Research)"
  821.       PRINT "          6. NETBIOS (DOS SHARE)"
  822.       PRINT "          7. DoubleDOS, but file sharing not supported."
  823. 60383 XX$ = "Select environment (0 to 7, [ENTER] quits)"
  824.       I! = FRE(C$)
  825.       LOCATE 24,1
  826.       PRINT STRING$(79,32);
  827.       LOCATE 24,5
  828.       PRINT XX$;
  829.       LINE INPUT;X$
  830.       IF X$ = "" THEN _
  831.          EXIT SUB
  832.       NETWORK.TYPE = VAL(X$)
  833.       IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  834.          GOTO 60383
  835. 60384 IF NETWORK.TYPE = 0 THEN _
  836.          NETWORK.TYPE$ = "IBM's DOS"
  837.       IF NETWORK.TYPE = 1 THEN _
  838.          MLCOM = TRUE : _
  839.          NETWORK.TYPE$ = "MultiLink"
  840.       IF NETWORK.TYPE = 2 THEN _
  841.          NETWORK.TYPE$ = "Omninet"
  842.       IF NETWORK.TYPE = 3 THEN _
  843.          NETWORK.TYPE$ = "PC-NET"
  844.       IF NETWORK.TYPE = 4 THEN _
  845.          NETWORK.TYPE$ = "DESQview"
  846.       IF NETWORK.TYPE = 5 THEN _
  847.          NETWORK.TYPE$ = "10 NET"
  848.       IF NETWORK.TYPE = 6 THEN _
  849.          NETWORK.TYPE$ = "NETBIOS"
  850.       IF NETWORK.TYPE = 7 THEN _
  851.          NETWORK.TYPE$ = "No file sharing!"
  852.       IF SUBROUTINE.PARAMETER = 2 THEN _
  853.          EXIT SUB
  854.       IF NETWORK.TYPE = 2 OR NETWORK.TYPE = 3 OR NETWORK.TYPE = 5 OR NETWORK.TYPE = 6 THEN _
  855.          CALL GETNUMYN ("Are you running Multi-Link with " + NETWORK.TYPE$,MLCOM)
  856.       END SUB
  857. '  $SUBTITLE: 'CNFGINIT - subroutine to initialize CONFIG's constants'
  858. '  $PAGE
  859. '
  860. '  SUBROUTINE NAME    --  CNFGINIT
  861. '
  862. '  INPUT PARAMETERS   --  NONE
  863. '
  864. '  OUTPUT PARAMETERS  --  CONFIG'S CONSTANTS INITIALIZED
  865. '
  866. '  SUBROUTINE PURPOSE --  TO INITIALIZE THE CONSTANTS USED BY CONFIG
  867. '
  868. 60385 SUB CNFGINIT STATIC
  869. '
  870. ' * INITALIZE ALL VARIABLES IF A .DEF FILE DOESN'T AREADY EXIST
  871. '
  872.       D$ = DD$
  873.       DRV$ = LEFT$(D$,1)
  874.       FALSE                      = 0
  875.       TRUE                       = NOT FALSE
  876.       SYSOP.SECURITY.LEVEL       = 10
  877.       ACT.MNTHS.B4.DELETING      = 1
  878.       ACTIVE.BULLETINS           = 6
  879.       ADD.DIR.SECURITY           = SYSOP.SECURITY.LEVEL
  880.       ALLOW.CALLER.TURBO         = 6
  881.       ALTDIR.EXTENSION$          = ""
  882.       ALWAYS.STREW.TO$           = ""
  883.       ANS.MENU$                  = D$ + "MENUA"
  884.       ASK.EXTENDED.DESC          = SYSOP.SECURITY.LEVEL
  885.       ASK.IDENTITY               = FALSE
  886.       AUTO.ADD.SECURITY          = 5
  887.       AUTO.UPGRADE.SEC           = SYSOP.SECURITY.LEVEL
  888.       AUTOPAGE.DEF$              = D$ + "AUTOPAGE.DEF"
  889.       BG                         = 0
  890.       BORDER                     = 0
  891.       BUFFER.SIZE                = 128
  892.       BULLETIN.MENU$             = "BULLET"
  893.       BULLETIN.PREFIX$           = "BULLET"
  894.       BULLETINS.OPTIONAL         = TRUE
  895.       C$                         = ""
  896.       CALLER.BKGRD               = 0
  897.       CALLERS.FILE$              = D$ + "CALLERS"
  898.       SEC.KILL.ANY               = SYSOP.SECURITY.LEVEL
  899.       COM.PORT$                  = "COM1"
  900.       COMMANDS.BETWEEN.RINGS     = FALSE
  901.       COMMANDS.IN.PROMPT         = TRUE
  902.       COMMENTS.AS.MESSAGES       = FALSE
  903.       COMMENTS.FILE$             = D$ + "COMMENTS"
  904.       COMPUTER.TYPE              = 0
  905.       CONFERENCE.MENU$           = D$ + "CONFENCE"
  906.       CONFERENCE.VIEWER.SEC.LVL  = 0
  907.       CONFMAIL.LIST$             = D$ + "CONFMAIL.DEF"
  908.       CONFIG.VERSION$            = "Version CPC17.2B"                ' KG060303
  909.       DEFAULT.CATEGORY.CODE$     = "UC "
  910.       DEFAULT.EXTENSION$         = "ZIP"
  911.       DAYS.IN.SUBSCRIPTION.PERIOD = 365
  912.       DAYS.TO.WARN               = 60
  913.       DIR.CATEGORY.FILE$         = D$ + "DIR.CAT"
  914.       DIRECTORY.PREFIX$          = "DIR"
  915.       DEFAULT.ECHOER$            = "R"
  916.       DEFAULT.LINE.ACK$          = ""
  917.       DEFAULT.SECURITY.LEVEL     = 5
  918.       DIRECTORY.EXTENTION$       = "DIR"
  919.       DIRECTORY.PATH$            = D$
  920.       DISK.FOR.DOS$              = D$
  921.       DISKFULL.GO.OFFLINE        = TRUE
  922.       DNLD.SUB                   = 0
  923.       DOORS.AVAILABLE            = FALSE
  924.       DOORS.DEF$                 = D$ + "DOORS.DEF"
  925.       DOORS.TERMINAL.TYPE        = 8
  926.       DOSANSI                    = FALSE
  927.       DOS.VERSION                = 2
  928.       DOWNLOAD.DRIVES$           = DRV$ + DRV$
  929.       DOWNLOAD.TO.SUBDIR         = FALSE
  930.       DRIVE.FOR.BULLETINS$       = D$
  931.       DRIVE.FOR.HELP.FILES$      = D$
  932.       DTR.DROP.DELAY             = 3
  933.       DUMB.MODEM                 = FALSE
  934.       ECHOER$                    = "R"
  935.       EMPHASIZE.OFF.DEF$         = "[27]" + "[0;40;33m"
  936.       EMPHASIZE.ON.DEF$          = "[27]" + "[1;41;37m"
  937.       END.OFFICE.HOURS           = 2200
  938.       ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
  939.       EPILOG$                    = D$ + "EPILOG.DEF"
  940.       ESCAPE.INSECURE            = FALSE
  941.       EXPERT.USER                = 0
  942.       EXPIRED.SECURITY           = DEFAULT.SECURITY.LEVEL
  943.       EXTENDED.LOGGING           = FALSE
  944.       FC                         = 5
  945.       FG                         = 7
  946.       FG.1.DEF$                  = "Bright Green"
  947.       FG.2.DEF$                  = "Bright Yellow"
  948.       FG.3.DEF$                  = "Bright Purple"
  949.       FG.4.DEF$                  = "Bright Cyan"
  950.       FILE.COMMANDS.DEFAULTS$    = "DGLNPSUV"
  951.       FILE.COMMANDS$             = FILE.COMMANDS.DEFAULTS$
  952.       FILE.NOTIFY                = FALSE
  953.       FILES.FUNCTION$(1,1)       = "D)ownload a file      "
  954.       FILES.FUNCTION$(2,1)       = "G)oodbye              "
  955.       FILES.FUNCTION$(3,1)       = "L)ist file directory  "
  956.       FILES.FUNCTION$(4,1)       = "N)ew file search      "
  957.       FILES.FUNCTION$(5,1)       = "P)ersonal files       "
  958.       FILES.FUNCTION$(6,1)       = "S)earch files         "
  959.       FILES.FUNCTION$(7,1)       = "U)pload a file        "
  960.       FILES.FUNCTION$(8,1)       = "V)erbose ARC list     "
  961.       FILES.FUNCTION$(1,2)       = "D"
  962.       FILES.FUNCTION$(2,2)       = "G"
  963.       FILES.FUNCTION$(3,2)       = "L"
  964.       FILES.FUNCTION$(4,2)       = "N"
  965.       FILES.FUNCTION$(5,2)       = "P"
  966.       FILES.FUNCTION$(6,2)       = "S"
  967.       FILES.FUNCTION$(7,2)       = "U"
  968.       FILES.FUNCTION$(8,2)       = "V"
  969.       FILESEC.FILE$              = D$ + "FILESEC"
  970.       FIRST.NAME.PROMPT$         = "FIRST name"
  971.       FOSSIL                     = 0
  972.       GB                         = FC
  973.       GLOBAL.COMMANDS.DEFAULTS$  = "H?QX"
  974.       GLOBAL.COMMANDS$           = GLOBAL.COMMANDS.DEFAULTS$
  975.       GLOBAL.FUNCTION$(1,1)      = "H)elp on-line           "
  976.       GLOBAL.FUNCTION$(2,1)      = "?)help on-line (=H)     "
  977.       GLOBAL.FUNCTION$(3,1)      = "Q)uit this part         "
  978.       GLOBAL.FUNCTION$(4,1)      = "X)Expert toggle on/off  "
  979.       GLOBAL.FUNCTION$(1,2)      = "H"
  980.       GLOBAL.FUNCTION$(2,2)      = "?"
  981.       GLOBAL.FUNCTION$(3,2)      = "Q"
  982.       GLOBAL.FUNCTION$(4,2)      = "X"
  983.       GO.TO.SHELL                = TRUE
  984.       HELP$(3)                   = "HELP03"
  985.       HELP$(4)                   = "HELP04"
  986.       HELP$(7)                   = "HELP07"
  987.       HELP$(9)                   = "HELP09"
  988.       HELP.EXTENSION$            = "HLP"
  989.       HELP.FILE.PREFIX$          = "HELP0"
  990.       HELP.PATH$                 = D$
  991.       HOST.ECHO.OFF$             = ""
  992.       HOST.ECHO.ON$              = ""
  993.       IB                         = 0
  994.       KEEP.INIT.BAUD             = FALSE
  995.       KEEP.TIME.CREDITS          = FALSE
  996.       LAST.NAME.PROMPT$          = "LAST name"
  997.       LEN.HASH                   = 31
  998.       LEN.INDIV                  = 0
  999.       LIBRARY.ARCHIVE.PATH$        = D$
  1000.       LIBRARY.ARCHIVE.PROGRAM$     = "ARCA "
  1001.       LIBRARY.COMMANDS.DEFAULTS$   = "ACDGLSV"
  1002.       LIBRARY.COMMANDS$            = LIBRARY.COMMANDS.DEFAULTS$
  1003.       LIBRARY.DRIVE$               = ""
  1004.       LIBRARY.MAX.DISK             = 705
  1005.       LIBRARY.MAX.DIRECTORY        = 7
  1006.       LIBRARY.MAX.SUBDIR           = 100
  1007.       LIBRARY.SUBDIR.PREFIX$       = "DISK"
  1008.       LIBRARY.DIRECTORY.PATH$      = D$
  1009.       LIBRARY.DIRECTORY.EXTENTION$ = "CDR"
  1010.       LIBRARY.FUNCTION$(1,1)       = "A)rchive a Library disk  "
  1011.       LIBRARY.FUNCTION$(2,1)       = "C)hange Library disk     "
  1012.       LIBRARY.FUNCTION$(3,1)       = "D)ownload a file         "
  1013.       LIBRARY.FUNCTION$(4,1)       = "G)oodbye                 "
  1014.       LIBRARY.FUNCTION$(5,1)       = "L)ist a file directory   "
  1015.       LIBRARY.FUNCTION$(6,1)       = "S)earch files            "
  1016.       LIBRARY.FUNCTION$(7,1)       = "V)erbose ARC list        "
  1017.       LIBRARY.FUNCTION$(1,2)       = "A"
  1018.       LIBRARY.FUNCTION$(2,2)       = "C"
  1019.       LIBRARY.FUNCTION$(3,2)       = "D"
  1020.       LIBRARY.FUNCTION$(4,2)       = "G"
  1021.       LIBRARY.FUNCTION$(5,2)       = "L"
  1022.       LIBRARY.FUNCTION$(6,2)       = "S"
  1023.       LIBRARY.FUNCTION$(7,2)       = "V"
  1024.       LIBRARY.WORK.DISK.PATH$      = D$
  1025.       LIMIT.SEARCH.TO.FMS        = FALSE
  1026.       LOGON.MAIL.LEVEL$          = "A"
  1027.       LSB                        = 1016
  1028. 60390 MACRO.DRVPATH$             = D$
  1029.       MACRO.EXTENSION$           = "MCR"
  1030.       MAIN.COMMANDS.DEFAULTS$    = "ABCDEFIJKOPRSTUVW@"
  1031.       MAIN.COMMANDS$             = MAIN.COMMANDS.DEFAULTS$
  1032.       MAIN.FUNCTION$(1,1)        = "A)nswer questionnaire  "
  1033.       MAIN.FUNCTION$(2,1)        = "B)ulletins             "
  1034.       MAIN.FUNCTION$(3,1)        = "C)omments              "
  1035.       MAIN.FUNCTION$(4,1)        = "D)oor subsystem        "
  1036.       MAIN.FUNCTION$(5,1)        = "E)nter message         "
  1037.       MAIN.FUNCTION$(6,1)        = "F)iles subsystem       "
  1038.       MAIN.FUNCTION$(7,1)        = "I)nitial welcome       "
  1039.       MAIN.FUNCTION$(8,1)        = "J)oin a conference     "
  1040.       MAIN.FUNCTION$(9,1)        = "K)ill messages         "
  1041.       MAIN.FUNCTION$(10,1)       = "O)perator page         "
  1042.       MAIN.FUNCTION$(11,1)       = "P)ersonal mail         "
  1043.       MAIN.FUNCTION$(12,1)       = "R)ead messages         "
  1044.       MAIN.FUNCTION$(13,1)       = "S)can messages header  "
  1045.       MAIN.FUNCTION$(14,1)       = "T)opic msg scan        "
  1046.       MAIN.FUNCTION$(15,1)       = "U)tilities subsystem   "
  1047.       MAIN.FUNCTION$(16,1)       = "V)iew conference mail  "
  1048.       MAIN.FUNCTION$(17,1)       = "W)ho's on other nodes  "
  1049.       MAIN.FUNCTION$(18,1)       = "@)Library subsystem    "
  1050.       MAIN.FUNCTION$(1,2)        = "A"
  1051.       MAIN.FUNCTION$(2,2)        = "B"
  1052.       MAIN.FUNCTION$(3,2)        = "C"
  1053.       MAIN.FUNCTION$(4,2)        = "D"
  1054.       MAIN.FUNCTION$(5,2)        = "E"
  1055.       MAIN.FUNCTION$(6,2)        = "F"
  1056.       MAIN.FUNCTION$(7,2)        = "I"
  1057.       MAIN.FUNCTION$(8,2)        = "J"
  1058.       MAIN.FUNCTION$(9,2)        = "K"
  1059.       MAIN.FUNCTION$(10,2)       = "O"
  1060.       MAIN.FUNCTION$(11,2)       = "P"
  1061.       MAIN.FUNCTION$(12,2)       = "R"
  1062.       MAIN.FUNCTION$(13,2)       = "S"
  1063.       MAIN.FUNCTION$(14,2)       = "T"
  1064.       MAIN.FUNCTION$(15,2)       = "U"
  1065.       MAIN.FUNCTION$(16,2)       = "V"
  1066.       MAIN.FUNCTION$(17,2)       = "W"
  1067.       MAIN.MESSAGE.BACKUP$       = D$ + "MESSAGES.BAK"
  1068.       MAIN.MESSAGE.FILE$         = D$ + "MESSAGES"
  1069.       MAIN.PUI$                  = D$ + "MAIN.PUI"
  1070.       MAIN.USER.FILE$            = D$ + "USERS"
  1071.       MASTER.DIRECTORY.NAME$     = ""
  1072.       MAX.ALLOWED.MSGS.FRM.DEF   = 5
  1073.       MAX.CARRIER.WAIT           = 30
  1074.       MAX.DESC.LEN               = 40
  1075.       MAX.EXTENDED.LINES         = 2
  1076.       MAX.MESSAGE.LINES          = 19
  1077.       MAX.PER.DAY                = 0
  1078.       MAX.REG.SEC                = 0
  1079.       MAX.USR.FILE.SIZE.FRM.DEF  = 16
  1080.       MAX.WORK.VAR               = 30
  1081.       MAXD                       = 15
  1082.       MAXIMUM.DISPLAYABLE.PAGES  = 17
  1083.       MAXIMUM.PASSWORD.CHANGES   = 3
  1084.       MAXIMUM.VIOLATIONS         = 5
  1085.       MAXIMUM.NUMBER.OF.NODES    = 1
  1086.       MENU$(1)                   = D$ + "MENU1"
  1087.       MENU$(2)                   = D$ + "MENU2"
  1088.       MENU$(3)                   = D$ + "MENU3"
  1089.       MENU$(4)                   = D$ + "MENU4"
  1090.       MENU$(5)                   = D$ + "MENU5"
  1091.       MENU$(6)                   = D$ + "MENU6"
  1092.       MENUS.CAN.PAUSE            = TRUE
  1093.       MESSAGE.REMINDER           = TRUE
  1094.       MESSAGES.CAN.GROW          = FALSE
  1095.       MIN.NEWCALLER.BAUD         = 0
  1096.       MIN.OLDCALLER.BAUD         = 0
  1097.       MIN.SEC.TO.VIEW            = DEFAULT.SECURITY.LEVEL
  1098.       MINIMUM.LOGON.SECURITY     = 0
  1099.       MINIMUM.SECURITY.FOR.TEMP.PASSWORD = 5
  1100.       MINUTES.PER.SESSION!       = 72
  1101.       MLCOM                      = FALSE
  1102.       MM                         = 5                                 ' KG072303
  1103.       MO$                        = DD$
  1104.       MODEM.ANSWER.COMMAND$      = "ATQ0X1V1A"
  1105.       MODEM.COMMAND.DELAY.TIME   = 1
  1106.       MODEM.COUNT.RINGS.COMMAND$ = "ATS1?"
  1107.       MODEM.GO.OFFHOOK.COMMAND$  = "ATQ1E1H1M0"
  1108.       MODEM.INIT.BAUD$           = "300"
  1109.       MODEM.INIT.COMMAND$        = "ATM0Q1S2=255S10=30E0Q0X1S0=254  "
  1110.       MODEM.INIT.WAIT.TIME       = 2
  1111.       MODEM.RESET.COMMAND$       = "ATZ"
  1112.       MUSIC                      = FALSE
  1113.       NET.MAIL$                  = "<none>"
  1114.       NETWORK.TYPE               = 0
  1115.       NETWORK.TYPE$              = "IBM's DOS"
  1116.       NEW.FILES.CHECK            = FALSE
  1117.       NEW.USER.QUESTIONNAIRE$    = D$ + "RBBS-REG.DEF"
  1118.       NEWUSER.FILE$              = D$ + "NEWUSER"
  1119.       NEWUSER.SETS.DEFAULTS      = TRUE
  1120.       OMIT.MAIN.DIRECTORY$       = "NO"
  1121.       OMIT.UPLOAD.DIRECTORY$     = "NO"
  1122.       OVERWRITE.SECURITY.LEVEL   = SYSOP.SECURITY.LEVEL
  1123.       PAGE.LENGTH                = 23
  1124.       PAGING.PRINTER.SUPPORT$    = ". "
  1125.       PASSWORD.FILE$             = D$ + "PASSWRDS"
  1126.       PCJR                       = FALSE
  1127.       PERSONAL.BEGIN             = 1
  1128.       PERSONAL.DIR$              = D$+"PRIV.DEF"
  1129.       PERSONAL.DRVPATH$          = D$
  1130.       PERSONAL.LEN               = 31
  1131.       PERSONAL.CONCAT            = FALSE
  1132.       PRELOG$                    = D$ + "PRELOG"
  1133.       PRIVATE.READ.SEC           = DEFAULT.SECURITY.LEVEL
  1134.       PROTO.DEF$                 = D$ + "PROTO.DEF"
  1135.       PROMPT.BELL                = 0
  1136.       PROMPT.HASH$               = "Name"
  1137.       PROMPT.INDIV$              = ""
  1138.       PS                         = 5
  1139.       PUBLIC.READ.SEC            = DEFAULT.SECURITY.LEVEL
  1140.       QUES.PATH$                 = D$
  1141.       RBBS.BAT$                  = D$ + "RBBS" + NODE.ID$ + ".BAT"
  1142.       RBBS.NAME$                 = "RBBS-PC"
  1143.       RCTTY.BAT$                 = D$ + "RCTTY" + NODE.ID$ + ".BAT"
  1144.       RECYCLE.TO.DOS             = 0
  1145.       RECYCLE.TO.DOS$            = "INTERNAL"
  1146.       RECYCLE.WAIT               = 0
  1147.       REDIRECT.IO.METHOD         = TRUE
  1148.       REGISTRATION.PROGRAM$      = "<none>"
  1149.       REMEMBER.NEW.USERS         = TRUE
  1150.       REMIND.FILE.TRANSFERS      = FALSE
  1151.       REMIND.PROFILE             = FALSE
  1152.       REQUIRE.NON.ASCII          = TRUE
  1153.       REQUIRED.QUESTIONNAIRE$    = "<none>"
  1154.       REQUIRED.RINGS             = 1
  1155.       RESTRICT.BAUD              = FALSE
  1156.       RESTRICT.BY.DATE           = FALSE
  1157.       RESTRICT.VALID.CMDS        = FALSE
  1158.       RTS$                       = "NO"
  1159.       SCREEN.OUT.MSG$            = "SEEN-BY: "
  1160.       SEC.CHANGE.MSG             = SYSOP.SECURITY.LEVEL
  1161.       SEC.LVL.EXEMPT.FRM.PURGING = SYSOP.SECURITY.LEVEL
  1162.       SECVIO.HLP$                = D$ + "SECVIO." + HELP.EXTENSION$
  1163.       SECURITY.EXEMPT.FROM.EPILOG= DEFAULT.SECURITY.LEVEL + 1
  1164.       SF                         = SYSOP.SECURITY.LEVEL
  1165.       SHOOT.YOURSELF             = FALSE
  1166.       SHOW.SECTION               = TRUE
  1167.       SIZE.OF.STACK              = 1024
  1168.       SL.CATEGORIZE.UPLOADS      = SYSOP.SECURITY.LEVEL
  1169.       SMART.TEXT                 = 123
  1170.       START.HASH                 = 1
  1171.       START.INDIV                = 0
  1172.       START.OFFICE.HOURS         = 800
  1173.       SURVIVE.NOUSER.ROOM        = FALSE
  1174.       SWITCH.BACK                = FALSE
  1175.       SYSOP.COMMANDS.DEFAULTS$   = "1234567"
  1176.       SYSOP.COMMANDS$            = SYSOP.COMMANDS.DEFAULTS$
  1177.       SYSOP.FUNCTION$(1,1)       = " 1 List comments      "
  1178.       SYSOP.FUNCTION$(2,1)       = " 2 List CALLERS log   "
  1179.       SYSOP.FUNCTION$(3,1)       = " 3 Recover a message  "
  1180.       SYSOP.FUNCTION$(4,1)       = " 4 Erase comments     "
  1181.       SYSOP.FUNCTION$(5,1)       = " 5 User maintenance   "
  1182.       SYSOP.FUNCTION$(6,1)       = " 6 Toggle Page bell   "
  1183.       SYSOP.FUNCTION$(7,1)       = " 7 Exit to DOS        "
  1184.       SYSOP.FUNCTION$(1,2)       = " 1"
  1185.       SYSOP.FUNCTION$(2,2)       = " 2"
  1186.       SYSOP.FUNCTION$(3,2)       = " 3"
  1187.       SYSOP.FUNCTION$(4,2)       = " 4"
  1188.       SYSOP.FUNCTION$(5,2)       = " 5"
  1189.       SYSOP.FUNCTION$(6,2)       = " 6"
  1190.       SYSOP.FUNCTION$(7,2)       = " 7"
  1191.       SYSOP.FIRST.NAME$          = "TOM"
  1192.       SYSOP.LAST.NAME$           = "MACK"
  1193.       SYSOP.MENU.SECURITY.LEVEL  = SYSOP.SECURITY.LEVEL
  1194.       SYSOP.PASSWORD.1$          = "RBBS-PC"
  1195.       SYSOP.PASSWORD.2$          = "CPC17-2A"
  1196.       TIME.TO.DROP.TO.DOS        = 0
  1197.       TRASHCAN.FILE$             = D$ + "TRASHCAN"
  1198.       TURN.PRINTER.OFF           = FALSE
  1199.       TURBO.RBBS                 = TRUE
  1200.       UE                         = 5
  1201.       FMS.DIRECTORY$             = ""
  1202.       UPCAT.HELP$                = "UPCAT"
  1203.       UPLOAD.DIRECTORY$          = "99"
  1204.       UPLOAD.PATH$               = D$
  1205.       UPLOAD.SUBDIR$             = ""
  1206.       UPLOAD.TIME.FACTOR!        = 0
  1207.       UPLOAD.TO.SUBDIR           = FALSE
  1208.       USE.BASIC.WRITES           = FALSE
  1209.       USE.DEVICE.DRIVER$         = ""
  1210.       USER.INITIALIZE.COMMAND$   = "AT&C1&D3B1E0V1M0S0=0&T5"
  1211.       USER.FIRMWARE.CLEAR.CMND$  = "AT&F"
  1212.       USER.FIRMWARE.WRITE.CMND$  = "&W"
  1213.       USER.LOCATION$             = "CITY and STATE"
  1214.       UTIL.COMMANDS.DEFAULTS$    = "BCEFGLMPRSTU"
  1215.       UTIL.COMMANDS$             = UTIL.COMMANDS.DEFAULTS$
  1216.       UTILITY.FUNCTION$(1,1)     = "B)aud rate            "
  1217.       UTILITY.FUNCTION$(2,1)     = "C)lock (time)         "
  1218.       UTILITY.FUNCTION$(3,1)     = "E)cho                 "
  1219.       UTILITY.FUNCTION$(4,1)     = "F)ile x-fer protocol  "
  1220.       UTILITY.FUNCTION$(5,1)     = "G)raphics             "
  1221.       UTILITY.FUNCTION$(6,1)     = "L)ines per page       "
  1222.       UTILITY.FUNCTION$(7,1)     = "M)sg margin setting   "
  1223.       UTILITY.FUNCTION$(8,1)     = "P)assword change      "
  1224.       UTILITY.FUNCTION$(9,1)     = "R)eview defaults      "
  1225.       UTILITY.FUNCTION$(10,1)    = "S)tatistics           "
  1226.       UTILITY.FUNCTION$(11,1)    = "T)oggle               "
  1227.       UTILITY.FUNCTION$(12,1)    = "U)ser log scan        "
  1228.       VOICE.TYPE                 = 0
  1229.       VOICE.TYPE$                = "None"
  1230.       XON.XOFF                   = FALSE
  1231.       FOR I = 1 TO LEN(UTIL.COMMANDS.DEFAULTS$)
  1232.          UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS.DEFAULTS$,I,1)
  1233.       NEXT
  1234.       WAIT.BEFORE.DISCONNECT     = 180
  1235.       WELCOME.FILE$              = D$ + "WELCOME"
  1236.       WELCOME.INTERRUPTABLE      = TRUE
  1237.       WILL.SUBDIRS.B.USED        = FALSE
  1238.       WRITE.BUF.DEF              = 1024
  1239.       FOR I = 1 TO NUM.SYSOP
  1240.          SYSOP.FUNCTION(I) = SF
  1241.       NEXT
  1242.       FOR I = 1 TO NUM.MAIN
  1243.          MAIN.FUNCTION(I) = MM
  1244.       NEXT
  1245.       FOR I = 1 TO NUM.FILES
  1246.          FILES.FUNCTION(I) = FC
  1247.       NEXT
  1248.       FOR I = 1 TO NUM.LIBRARY
  1249.          LIBRARY.FUNCTION(I) = PS
  1250.       NEXT
  1251.       FOR I = 1 TO NUM.UTILITY
  1252.          UTILITY.FUNCTION(I) = UE
  1253.       NEXT
  1254.       FOR I = 1 TO NUM.GLOBAL
  1255.          GLOBAL.FUNCTION(I) = GB
  1256.       NEXT
  1257.       END SUB
  1258. '  $SUBTITLE: 'VOICETYPE - subroutine to select voice'
  1259. '  $PAGE
  1260. '
  1261. '  SUBROUTINE NAME    --  VOICETYPE
  1262. '
  1263. '  INPUT PARAMETERS   --  VOICE.TYPE
  1264. '                         VOICE.TYPE$
  1265. '                         SUBROUTINE.PARAMETER
  1266. '
  1267. '  OUTPUT PARAMETERS  --  VOICE.TYPE
  1268. '                         VOICE.TYPE$
  1269. '
  1270. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED VOICE
  1271. '                         SYNTHESIZERS
  1272. '
  1273.       SUB VOICETYPE STATIC
  1274.       ON SUBROUTINE.PARAMETER GOTO 60482,60484
  1275. 60482 CLS
  1276.       LOCATE 3,1
  1277.       PRINT "     RBBS-PC is supported in the following:"
  1278.       PRINT "            Voice Synthesizers"
  1279.       PRINT "          0. None"
  1280.       PRINT "          1. CompuTalker"
  1281.       PRINT "             B.G. MICRO"
  1282.       PRINT "             P.O. Box 280298"
  1283.       PRINT "             Dallas, Texas 75228"
  1284.       PRINT "          2. HearSay 1000"
  1285.       PRINT "             HEARSAY INC."
  1286.       PRINT "             1825 74th Street"
  1287.       PRINT "             Brooklyn, New York 11204"
  1288. 60483 CALL ASKRO("Select environment (0 to 2, [ENTER] quits)",24,X$)
  1289.       IF X$ = "" THEN _
  1290.          EXIT SUB
  1291.       VOICE.TYPE = VAL(X$)
  1292.       IF VOICE.TYPE < 0 OR VOICE.TYPE > 2 THEN _
  1293.          GOTO 60483
  1294. 60484 IF VOICE.TYPE = 0 THEN _
  1295.          VOICE.TYPE$ = "None"
  1296.       IF VOICE.TYPE = 1 THEN _
  1297.          VOICE.TYPE$ = "CompuTalker"
  1298.       IF VOICE.TYPE = 2 THEN _
  1299.          VOICE.TYPE$ = "HearSay 1000"
  1300.       END SUB
  1301. '  $SUBTITLE: 'ASKRO - ask a question at a specific row'
  1302. '  $PAGE
  1303. '
  1304. '  SUBROUTINE NAME    --  ASKRO
  1305. '
  1306. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1307. '                         ANS$           STRING TO PUT THE ANSWER IN
  1308. '                         STRNG$         STRING CONTAINING THE QUESTION
  1309. '                         RO             ROW TO ASK THE QUESTION ON
  1310. '
  1311. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1312. '
  1313. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1314. '                         SPECIFIC ROW
  1315. '
  1316.       SUB ASKRO (STRNG$,RO,ANS$) STATIC
  1317. 61100 LOCATE RO,1
  1318.       PRINT SPACE$(79);
  1319.       LOCATE RO,5
  1320.       PRINT STRNG$;" ";
  1321.       LINE INPUT;ANS$
  1322.       END SUB
  1323. '  $SUBTITLE: 'GETINIT - get an integer'
  1324. '  $PAGE
  1325. '
  1326. '  SUBROUTINE NAME    --  GETINIT
  1327. '
  1328. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1329. '                         ANS            WHERE TO PUT THE ANSWER IN
  1330. '                         STRNG$         STRING CONTAINING THE QUESTION
  1331. '                         RO             ROW TO ASK THE QUESTION ON
  1332. '                         MIN            MINIMUM ACCEPTABLE NUMBER
  1333. '                         MAX            MAXIMUM ACCEPTABLE NUMBER
  1334. '
  1335. '  OUTPUT PARAMETERS  --  ANS            RESPONSE FROM THE KEYBOARD
  1336. '
  1337. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1338. '                         SPECIFIC ROW AND GET AN INTEGER BACK
  1339. '
  1340.       SUB GETINIT (STRNG$,RO,MIN,MAX,ANS,CR) STATIC
  1341. 61110 LOCATE RO,1
  1342.       CR = FALSE
  1343.       ANS = MIN
  1344.       PRINT SPACE$(79);
  1345.       LOCATE RO,5
  1346.       PRINT STRNG$;" ";
  1347.       LINE INPUT;ANS$
  1348.       IF ANS$ = "" THEN _
  1349.          CR = TRUE : _
  1350.          EXIT SUB
  1351.       IF VAL(ANS$) < MIN OR _
  1352.          VAL(ANS$) > MAX THEN _
  1353.          GOTO 61110
  1354.       ANS = VAL(ANS$)
  1355.       END SUB
  1356. '  $SUBTITLE: 'GETNUMYN - get a TRUE-FALSE answer to a YES OR NO question'
  1357. '  $PAGE
  1358. '
  1359. '  SUBROUTINE NAME    --  GETNUMYN
  1360. '
  1361. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1362. '                         STRNG$         STRING CONTAINING THE QUESTION
  1363. '
  1364. '  OUTPUT PARAMETERS  --  ANS            Returned value - -1 IF yes, 0 IF no
  1365. '
  1366. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1367. '                         YES OR NO ANSWER CONVERTED TO TRUE/FALSE
  1368. '
  1369.        SUB GETNUMYN (STRNG$,ANS) STATIC
  1370.        CALL GETYESNO (STRNG$,ANS$)
  1371.        ANS = FNYESNO (ANS$)
  1372.        END SUB
  1373. '  $SUBTITLE: 'GETYESNO - Ask a YES OR NO question'
  1374. '  $PAGE
  1375. '
  1376. '  SUBROUTINE NAME    --  GETYESNO
  1377. '
  1378. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1379. '                         ANS$           STRING TO PUT THE ANSWER IN
  1380. '                         STRNG$         STRING CONTAINING THE QUESTION
  1381. '
  1382. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1383. '
  1384. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1385. '                         YES OR NO ANSWER
  1386. '
  1387.       SUB GETYESNO (STRNG$,ANS$) STATIC
  1388. 61200 CALL ASKRO (STRNG$+" Y)es or N)o",24,HJ$)                      ' RS060401
  1389.       L = LEN(HJ$)
  1390.       IF L < 1 OR L > 3 THEN _
  1391.          GOTO 61207
  1392.       CALL ALLCAPS(HJ$)
  1393.       X = INSTR("NY",LEFT$(HJ$,1))
  1394.       ON X GOTO 61210,61212
  1395. 61207 BEEP
  1396.       GOTO 61200
  1397. 61210 ANS$ = "NO"
  1398.       EXIT SUB
  1399. 61212 ANS$ = "YES"
  1400.       EXIT SUB
  1401.       END SUB
  1402. '  $SUBTITLE: 'ALLCAPS - convert a sting into all capital letters'
  1403. '  $PAGE
  1404. '
  1405. '  SUBROUTINE NAME    --  ALLCAPS
  1406. '
  1407. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1408. '                         STRNG$         STRING CONTAINING THE QUESTION
  1409. '
  1410. '  OUTPUT PARAMETERS  --  STRNG$         CAPITALIZED STRING
  1411. '
  1412. '  SUBROUTINE PURPOSE --  TO CAPITALIZE A STRING
  1413. '
  1414.       SUB ALLCAPS (STRNG$) STATIC
  1415.       FOR Z = 1 TO LEN(STRNG$)
  1416.         MID$(STRNG$,Z,1) = CHR$(ASC(MID$(STRNG$,Z,1)) + _
  1417.                            32 * (ASC(MID$(STRNG$,Z,1)) > 96))
  1418.       NEXT
  1419.       END SUB
  1420. '  $SUBTITLE: 'ASKUPOS - find the unique user field for USERS'
  1421. '  $PAGE
  1422. '
  1423. '  SUBROUTINE NAME    --  ASKUPOS
  1424. '
  1425. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1426. '                         HDR$           HEADER
  1427. '                         BEGIN.COL      BEGINNING COLUMN OF FIELD
  1428. '                         FIELD.LEN      LENGTH OF FIELD IN USER'S RECORD
  1429. '                         PRMPT$         PROMPT TO GIVE FOR FIELD
  1430. '
  1431. '  OUTPUT PARAMETERS  --  ABOVE INPUTS UPDATED WITH USER'S RESPONSES
  1432. '
  1433. '  SUBROUTINE PURPOSE --  TO ASK THE SYSOP WHAT UNIQUE FIELD IN THE USERS
  1434. '                         RECORD IS TO BE ASKED FOR AT LOGON
  1435. '
  1436.       SUB ASKUPOS (HDR$,BEGIN.COL,FIELD.LEN,PRMPT$) STATIC
  1437.       CLS
  1438.       LOCATE 3,20
  1439.       PRINT HDR$;
  1440. 61300 LOCATE 6,5
  1441.       PRINT "1.  BEGINNING COLUMN in USERS file";TAB(44);STR$(BEGIN.COL);"   ";
  1442.       LOCATE 8,5
  1443.       PRINT "2.  Number of CHARACTERS to use";TAB(44);STR$(FIELD.LEN);"   ";
  1444.       LOCATE 10,5
  1445.       PRINT "3.  PROMPT to display to callers";TAB(45);PRMPT$;SPACE$(34-LEN(PRMPT$));
  1446. 61310 CALL ASKRO ("Select option to change (1-3, ENTER to end)",24,X$)
  1447.       IF X$ = "" THEN _
  1448.          EXIT SUB
  1449.       X = VAL(X$)
  1450.       IF X < 1 OR X > 3 THEN _
  1451.          GOTO 61310
  1452.       ON X GOTO 61320,61330,61340
  1453. 61320 CALL ASKRO ("New BEGINNING COLUMN",24,HJ$)
  1454.       IF HJ$ = "" THEN _
  1455.          GOTO 61320
  1456.       X = VAL(HJ$)
  1457.       IF X < 0 OR X > 128 THEN _
  1458.          GOTO 61320
  1459.       BEGIN.COL = X
  1460.       GOTO 61300
  1461. 61330 CALL ASKRO ("New # CHARACTERS to use",24,HJ$)
  1462.       IF HJ$ = "" THEN _
  1463.          GOTO 61330
  1464.       X = VAL(HJ$)
  1465.       IF X < 0 OR X > 31 THEN _
  1466.          GOTO 61330
  1467.       FIELD.LEN = X
  1468.       GOTO 61300
  1469. 61340 CALL ASKRO ("New PROMPT",24,HJ$)
  1470.       IF LEN(HJ$) > 34 THEN _
  1471.          GOTO 61340
  1472.       PRMPT$ = HJ$
  1473.       GOTO 61300
  1474.       END SUB
  1475. '  $SUBTITLE: 'ANYNUMBER - input any numeric value'
  1476. '  $PAGE
  1477. '
  1478. '  SUBROUTINE NAME    --  ANYNUMBER
  1479. '
  1480. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1481. '                         PRMPT$           PROMPT
  1482. '
  1483. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1484. '
  1485. '  SUBROUTINE PURPOSE --  TO GET A NUMERIC VALUE
  1486. '
  1487.       SUB ANYNUMBER (PRMPT$,RETURNED.VALUE!) STATIC
  1488. 61400 CALL ASKRO (PRMPT$,24,HJ$)
  1489.       RETURNED.VALUE! = VAL(HJ$)
  1490.       END SUB
  1491. '  $SUBTITLE: 'ANYINTEGER - input any integer value'
  1492. '  $PAGE
  1493. '
  1494. '  SUBROUTINE NAME    --  ANYINTEGER
  1495. '
  1496. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1497. '                         PRMPT$           PROMPT TO DISPLAY
  1498. '
  1499. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1500. '
  1501. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE
  1502. '
  1503.       SUB ANYINTEGER (PRMPT$,RETURNED.VALUE) STATIC
  1504. 61450 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1505.       IF RETURNED.VALUE! >  32767.0 OR _
  1506.          RETURNED.VALUE! < -32767.0 THEN_
  1507.          BEEP : _
  1508.          GOTO 61450
  1509.       RETURNED.VALUE = RETURNED.VALUE!
  1510.       END SUB
  1511. '  $SUBTITLE: 'MMINTEGER - input any integer value with range check'
  1512. '  $PAGE
  1513. '
  1514. '  SUBROUTINE NAME    --  MMINTEGER
  1515. '
  1516. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1517. '                         PRMPT$           PROMPT
  1518. '                         MIN              MINIMUM VALUE (INCLUSIVE)
  1519. '                         MAX              MAXIMUM VALUE (INCLUSIVE)
  1520. '
  1521. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1522. '
  1523. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE WITHIN A RANGE
  1524. '
  1525.       SUB MMINTEGER (PRMPT$,MIN,MAX,RETURNED.VALUE) STATIC
  1526. 61500 CALL ANYINTEGER (PRMPT$,RETURNED.VALUE)
  1527.       IF RETURNED.VALUE < MIN OR RETURNED.VALUE > MAX THEN _
  1528.          BEEP : _
  1529.          GOTO 61500
  1530.       END SUB
  1531. '  $SUBTITLE: 'MMREAL - input any single precision real # with range check'
  1532. '  $PAGE
  1533. '
  1534. '  SUBROUTINE NAME    --  MMREAL
  1535. '
  1536. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1537. '                         PRMPT$           PROMPT
  1538. '                         MIN!             MINIMUM VALUE (INCLUSIVE)
  1539. '                         MAX!             MAXIMUM VALUE (INCLUSIVE)
  1540. '
  1541. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1542. '
  1543. '  SUBROUTINE PURPOSE --  TO GET AN REAL # VALUE WITHIN A RANGE
  1544. '
  1545.       SUB MMREAL (PRMPT$,MIN!,MAX!,RETURNED.VALUE!) STATIC           ' KG090102
  1546. 61550 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)                        ' KG090102
  1547.       IF RETURNED.VALUE! < MIN! OR RETURNED.VALUE! > MAX! THEN _     ' KG090102
  1548.          BEEP : _                                                    ' KG090102
  1549.          GOTO 61550                                                  ' KG090102
  1550.       END SUB                                                        ' KG090102
  1551. '  $SUBTITLE: 'FINDFILE - Determine whether a file exists'
  1552. '  $PAGE
  1553. '
  1554. '  SUBROUTINE NAME    --  FINDFILE
  1555. '
  1556. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1557. '                         FILNAME$         FILE TO LOOK FOR
  1558. '                         FEXISTS          WHETHER FILE EXISTS
  1559. '
  1560. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1561. '
  1562. '  SUBROUTINE PURPOSE --  DETERMINE WHETHER PASSED FILE NAME EXISTS
  1563. '                         RETURN TRUE OR FALSE IN "FEXISTS"
  1564. '
  1565.       SUB FINDFILE (FILNAME$,FEXISTS) STATIC
  1566. 61600 CALL RBBSFIND (FILNAME$,Z,Y,M,D)
  1567.       FEXISTS = (Z = 0)
  1568.       END SUB
  1569. '  $SUBTITLE: 'CHKFMSDIR - Validate structure of FMS directory'
  1570. '  $PAGE
  1571. '
  1572. '  SUBROUTINE NAME    --  CHKFMSDIR
  1573. '
  1574. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1575. '                         FMSDIR$         NAME OF FMS DIRECTORY
  1576. '                         LINELEN         PROPER LENGTH OF LINES
  1577. '                                         (EXCLUDING CR/LF AT END)
  1578. '                         FMS.DIRCAT$     CATEGORY FILE FOR FMS
  1579. '
  1580. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1581. '
  1582. '  SUBROUTINE PURPOSE --  VERIFIES THAT FMS IS IN VALID FORMAT
  1583. '                         AND DIAGNOSES PROBLEMS
  1584. '
  1585. 61700 SUB CHKFMSDIR (FMSDIR$,LINELEN,FMS.DIRCAT$) STATIC
  1586.       DIM CAT.CODE$(99)
  1587.       CLS
  1588.       LOCATE 5,20
  1589.       PRINT "Checking FMS file ";FMSDIR$;
  1590.       NLINES = 0
  1591.       LOCATE 7,27
  1592.       PRINT "Line #";
  1593.       LOCATE 9,20
  1594.       COLOR 0,7
  1595.       PRINT " Last Line with an ERROR ";
  1596.       LOCATE 12,28
  1597.       PRINT " Last ERROR ";
  1598.       COLOR 7,0
  1599.       NCATS = 0
  1600.       CALL FINDFILE (FMS.DIRCAT$,FEXISTS)
  1601.       IF FEXISTS THEN _
  1602.          NCATS = 1:_
  1603.          CAT.CODE$(1) = "***":_
  1604.          OPEN FMS.DIRCAT$ FOR INPUT AS #2 : _
  1605.          WHILE NOT EOF(2) AND NCATS < UBOUND(CAT.CODE$) :_
  1606.             NCATS = NCATS + 1:_
  1607.             INPUT #2,X$,Y$,X$:_
  1608.             CAT.CODE$(NCATS) = Y$:_
  1609.          WEND:_
  1610.          CLOSE 2
  1611.       GO.ON = -1
  1612.       CALL FINDFILE (FMSDIR$,FEXISTS)
  1613.       IF NOT FEXISTS THEN _
  1614.          LOCATE 6,25 : _
  1615.          PRINT "File not found"; : _
  1616.          GOTO 61750
  1617.       OPEN FMSDIR$ FOR INPUT AS #2
  1618.       WHILE NOT EOF(2) AND GO.ON
  1619.          NLINES = NLINES + 1
  1620.          LINE INPUT #2, A$
  1621.          L = LEN(A$)
  1622.          LOCATE 7,36
  1623.          PRINT NLINES;
  1624.          IF L > LINELEN THEN _
  1625.             CALL HANDERR (A$,NLINES,"Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN),GO.ON):_
  1626.             IF NOT GO.ON THEN _
  1627.                GOTO 61740
  1628.          IF L < LINELEN THEN _
  1629.             X$ = "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN) : _
  1630.             CALL HANDERR (A$,NLINES,X$,GO.ON):_
  1631.             IF NOT GO.ON THEN _
  1632.                GOTO 61740
  1633.          IF L > 0 THEN _
  1634.             IF INSTR ("\* ",LEFT$(A$,1)) THEN _
  1635.                GOTO 61740
  1636.          IF L > 30 THEN _
  1637.             X$ = MID$(A$,24,2) + _
  1638.                  MID$(A$,27,2) + _
  1639.                  MID$(A$,30,2) : _
  1640.             I = 1 : _
  1641.             WHILE I < 7 AND INSTR("0123456789",MID$(X$,I,1)) > 0 : _
  1642.                I = I + 1: _
  1643.             WEND: _
  1644.             IF I < 7 THEN _
  1645.                CALL HANDERR (A$,NLINES,"INVALID CHARACTER <" + MID$(X$,I,1) + "> in date field",GO.ON) : _
  1646.                IF NOT GO.ON THEN _
  1647.                   GOTO 61740
  1648.          I = 1
  1649.          Y$ = MID$(A$,L - 2)
  1650.          CALL REMOVE (Y$," ")
  1651.          WHILE I <= NCATS AND Y$ <> CAT.CODE$(I)
  1652.             I = I + 1
  1653.          WEND
  1654.          IF I > NCATS THEN _
  1655.             CALL HANDERR (A$,NLINES,"Category code <" + Y$ + "> NOT IN " + FMS.DIRCAT$,GO.ON)
  1656. 61740 WEND
  1657. 61750 CLOSE 2
  1658.       IF GO.ON THEN _
  1659.          LOCATE 15,15:_
  1660.          BEEP:_
  1661.          CALL ASKRO ("           Done checking.  Press [ENTER] to continue",20,ANS$)
  1662.       END SUB
  1663. '  $SUBTITLE: 'CHKPERSDIR - Validate personal directories'
  1664. '  $PAGE
  1665. '
  1666. '  SUBROUTINE NAME    --  CHKPERSDIR
  1667. '
  1668. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1669. '                         PDIR$           NAME OF PERSONAL DIRECTORY
  1670. '                         NAMELEN         PROPER LENGTH OF NAME FIELD
  1671. '
  1672. '  OUTPUT PARAMETERS  --  NONE
  1673. '
  1674. '  SUBROUTINE PURPOSE --  CHECKS PERSONAL DIRECTORY FOR PROPER FORMAT
  1675. '
  1676. 61755 SUB CHKPERSDIR (PDIR$, DESC.LEN, NAMELEN) STATIC
  1677.       CLS
  1678.       LOCATE 5, 21
  1679.       PRINT "Checking Personal Directory "; PDIR$;
  1680.       NLINES = 0
  1681.       LOCATE 7, 27
  1682.       PRINT "Line #";
  1683.       LOCATE 9, 20
  1684.       COLOR 0, 7
  1685.       PRINT " Last Line with an ERROR ";
  1686.       LOCATE 12, 28
  1687.       PRINT " Last ERROR ";
  1688.       COLOR 7, 0
  1689.       GO.ON = -1
  1690.       CALL FINDFILE(PDIR$, FEXISTS)
  1691.       IF NOT FEXISTS THEN _
  1692.          LOCATE 6, 25: _
  1693.          PRINT "File not found"; : _
  1694.          GOTO 61775
  1695.       LINELEN = 34 + DESC.LEN + NAMELEN
  1696.       OPEN PDIR$ FOR INPUT AS #2
  1697.       WHILE NOT EOF(2) AND GO.ON
  1698.          NLINES = NLINES + 1
  1699.          LINE INPUT #2, A$
  1700.          L = LEN(A$)
  1701.          LOCATE 7, 36
  1702.          PRINT NLINES;
  1703.          IF L > LINELEN THEN _
  1704.             CALL HANDERR(A$, NLINES, "Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1705.             IF NOT GO.ON THEN _
  1706.                GOTO 61770
  1707.          IF L < LINELEN THEN _
  1708.             CALL HANDERR(A$, NLINES, "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1709.                IF NOT GO.ON THEN _
  1710.                   GOTO 61770
  1711.          IF L > 30 THEN _
  1712.             X$ = MID$(A$, 24, 2) + MID$(A$, 27, 2) + MID$(A$, 30, 2) : _
  1713.             I = 1 : _
  1714.             WHILE I < 7 AND INSTR("0123456789", MID$(X$, I, 1)) > 0 : _
  1715.                I = I + 1 : _
  1716.             WEND : _
  1717.             IF I < 7 THEN _
  1718.                CALL HANDERR(A$, NLINES, "INVALID CHARACTER <" + MID$(X$, I, 1) + "> in date field", GO.ON) : _
  1719.                IF NOT GO.ON THEN _
  1720.                   GOTO 61770
  1721.            IF L = LINELEN THEN _
  1722.               X$ = RIGHT$(A$, 1) : _
  1723.               IF INSTR("*!", X$) = 0 THEN _
  1724.                  CALL HANDERR(A$, NLINES, "Last char on line should be * or ! but found <" + X$ + ">", GO.ON) : _
  1725.                  IF NOT GO.ON THEN  _
  1726.                     GOTO 61770
  1727.            IF L = LINELEN THEN _
  1728.               X$ = MID$(A$, L - NAMELEN, LINELEN) : _
  1729.               IF LEFT$(X$, 1) = " " THEN _
  1730.                  IF INSTR("0123456789-", MID$(X$, 2, 1)) = 0 THEN _
  1731.                     CALL HANDERR(A$, NLINES, "Name field at col" + STR$(L - NAMELEN) + " has <" + LEFT$(X$, 1) + ">, needs non-blank or blank+number", GO.ON) : _
  1732.                     IF NOT GO.ON THEN _
  1733.                        GOTO 61770
  1734. 61770 WEND
  1735. 61775 CLOSE 2
  1736.       IF GO.ON THEN _
  1737.          LOCATE 15, 15 : _
  1738.          BEEP : _
  1739.          CALL ASKRO("           Done checking.  Press [ENTER] to continue", 20, ANS$)
  1740.       END SUB
  1741. '  $SUBTITLE: 'HANDERR - subroutine to handle FMS errors'
  1742. '  $PAGE
  1743. '
  1744. '  SUBROUTINE NAME    -- HANDERR
  1745. '
  1746. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1747. '                        ERRLINE$                LINE THAT HAS THE ERROR
  1748. '                        ERRL                    LINE NUMBER WITH ERROR
  1749. '                        ERRMES$                 ERROR MESSAGE TO ISSUE
  1750. '
  1751. '  OUTPUT PARAMETERS  -- GO.ON                   INIDCATE TO PROCEDURE OR NOT
  1752. '
  1753. '  SUBROUTINE PURPOSE -- TO HANDLE ERROR CHECKING OF THE FMS DIRECTORY
  1754. '
  1755.       SUB HANDERR (ERRLINE$,ERRL,ERRMES$,GO.ON) STATIC
  1756.       LOCATE 10,1
  1757.       PRINT SPACE$(80);
  1758.       LOCATE 10,1
  1759.       PRINT ERRLINE$;
  1760.       LOCATE 9,45
  1761.       PRINT STR$(ERRL);
  1762.       LOCATE 13,1
  1763.       PRINT SPACE$(79);
  1764.       L = LEN(ERRMES$)
  1765.       IF L > 68 THEN _
  1766.          STRT = 1 _
  1767.       ELSE STRT = (70 - L) / 2
  1768.       LOCATE 13,STRT
  1769.       PRINT ERRMES$;
  1770.       CALL ASKRO ("               CONTINUE checking (Y/N,[ENTER]=Y) ",20,ANS$)
  1771.       IF ANS$ = "" THEN _
  1772.          ANS$ = "Y"
  1773.       CALL ALLCAPS (ANS$)
  1774.       GO.ON = FNYESNO (ANS$)
  1775.       END SUB
  1776. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  1777. ' $PAGE
  1778. '
  1779. '  SUBROUTINE NAME    -- REMOVE
  1780. '
  1781. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1782. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  1783. '                                                TO BE DELETED FROM "L$"
  1784. '                        L$                      STRING TO BE ALTERED
  1785. '
  1786. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  1787. '                                                "BADSTRING#" DELETED FROM IT
  1788. '
  1789. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  1790. '                        "BADSTRING$" FROM "L$"
  1791. '
  1792.       SUB REMOVE (L$,BADSTRNG$) STATIC
  1793. 61800 J = 0
  1794.       FOR I = 1 TO LEN(L$)
  1795.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  1796.             J = J + 1:_
  1797.             MID$(L$,J,1) = MID$(L$,I,1)
  1798.       NEXT I
  1799.       L$ = LEFT$(L$,J)
  1800.       END SUB
  1801. ' $SUBTITLE: 'GETASCII - subroutine to prompt for any ASCII values'
  1802. ' $PAGE
  1803. '
  1804. '  SUBROUTINE NAME    -- GETASCII
  1805. '
  1806. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1807. '                        TITLE$                  HEADER EXPANATION FOR PARAM
  1808. '
  1809. '  OUTPUT PARAMETERS  -- STRNG$                  RESULTANT CONFIG PARAMETER
  1810. '
  1811. '  SUBROUTINE PURPOSE -- ALLOWS ANY ASCII CHARACTER TO BE STORED IN A PARAMETER
  1812. '                        BY ENCLOSING IT IN SQUARE BRACKETS.  CHARACTERS NOT IN
  1813. '                        SQUARE BRACKETS ARE INTERPRETED EXACTLY AS ENTERED.
  1814. '                        CHARACTER'S ASCII VALUE EQUAL THE NUMERIC VALUE IN THE
  1815. '                        SQUARE BRACKETS.
  1816. '
  1817.       SUB GETASCII (TITLE$,STRNG$) STATIC
  1818. 61810 CLS
  1819.       LOCATE 8,30
  1820.       PRINT TITLE$;
  1821.       LOCATE 13,5
  1822.       PRINT "Current value is"
  1823.       PRINT STRNG$
  1824.       PRINT
  1825.       PRINT "Please enter the new values by entering the character"
  1826.       PRINT "or enclosing its ASCII value in square brackets:"
  1827.       PRINT "(Press ENTER to make empty)
  1828.       LINE INPUT "";HJ$
  1829.       STRNG$ = HJ$
  1830.       END SUB
  1831. ' $SUBTITLE: 'BRKFNAME - subroutine to decompose a file name'
  1832. ' $PAGE
  1833. '
  1834. '  SUBROUTINE NAME    -- BRKFNAME
  1835. '
  1836. '  INPUT PARAMETERS   -- PARAMETER                     MEANING
  1837. '                        FILENAME$       NAME OF THE FILE TO BE DECOMPOSED
  1838. '                        FOR.JOINING     INDICATOR IF OUTPUT IS TO BE COMPBINED
  1839. '
  1840. '  OUTPUT PARAMETERS  -- DRVPATH$        DRIVE AND PATH
  1841. '                        PREFIX$         8-CHARACTER FILE NAME PREFIX
  1842. '                        EXTENSION$      3-CHARACTER EXTENSION
  1843. '
  1844. '  SUBROUTINE PURPOSE -- BREAKS DOWN A FILE NAME INTO A DRIVE AND PATH,
  1845. '                        FILE PREFIX (8 CHARACTERS), AND FILE EXTENSION
  1846. '                        (3 CHARACTERS).  IF "FOR.JOINING" IS TRUE, THE
  1847. '                        DRIVE AND PATH HAVE A ":" AND A "\" IN IT AND
  1848. '                        THE EXTENSION BEGINS WITH A ".".
  1849. '
  1850.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1851. 61830 CALL ALLCAPS (FILENAME$)
  1852.       DRVPATH$ = ""
  1853.       PREFIX$ = ""
  1854.       EXTENSION$ = ""
  1855.       CALL TRIMTRAIL (FILENAME$,"\")
  1856.       IF LEN(FILENAME$) < 1 THEN _
  1857.          EXIT SUB
  1858.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1859.       IF X < 1 THEN _
  1860.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1861.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1862.             S = 3 _
  1863.          ELSE S = 1 _
  1864.       ELSE DRVPATH$ = LEFT$(FILENAME$,X - 1) : _
  1865.            S = X + 1
  1866.       X = INSTR(FILENAME$+".",".")
  1867.       EXTENSION$ = MID$(FILENAME$,X + 1,3)
  1868.       PREFIX$ = MID$(FILENAME$,S,X - S)
  1869.       IF NOT FOR.JOINING THEN _
  1870.          EXIT SUB
  1871.       IF LEN(DRVPATH$) = 1 THEN _
  1872.          DRVPATH$ = DRVPATH$ + ":"
  1873.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1874.          DRVPATH$ = DRVPATH$ + "\"
  1875.       IF LEN(EXTENSION$) > 0 THEN _
  1876.          EXTENSION$ = "." + EXTENSION$
  1877.       END SUB
  1878. '
  1879. '  $SUBTITLE: 'TRIMTRAIL - subroutine to trim off trailing characters'
  1880. '  $PAGE
  1881. '
  1882. '  SUBROUTINE NAME    --  TRIMTRAIL
  1883. '
  1884. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  1885. '                         TRIM.PARM$  TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  1886. '                                     BEFORE DISPLAYING
  1887. '                         TRIM.THIS$  WHAT CHARACTER TO TRIM OFF END
  1888. '
  1889. '  OUTPUT PARAMETERS  --  NONE
  1890. '
  1891. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  1892. '
  1893. 61840 SUB TRIMTRAIL (TRIM.PARM$,TRIM.THIS$) STATIC
  1894.       WHILE RIGHT$(TRIM.PARM$,1) = TRIM.THIS$
  1895.          TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$) - 1)
  1896.       WEND
  1897.       END SUB
  1898. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  1899. ' $PAGE
  1900. '
  1901. '  SUBROUTINE NAME    -- FINDLAST
  1902. '
  1903. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1904. '                        LOOK.IN$           STRING TO LOOK INTO
  1905. '                        LOOK.FOR$          STRING TO SEARCH FOR
  1906. '
  1907. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  1908. '                                            LOOK.FOR$ FOUND
  1909. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  1910. '
  1911. '  SUBROUTINE PURPOSE -- FINDS THE LAST OCCURANCE OF "LOOK.FOR$" IN "LOOK.IN$"
  1912. '                        AND RETURNS COUNT OF NUMBER OF OCCURENCES.  IF NONE
  1913. '                        ARE FOUND, BOTH RETURNED PARAMETERS ARE ZERO.
  1914. '
  1915.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  1916. 61850 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  1917.       NUM.FINDS = -(WHERE.FOUND > 0)
  1918.       NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1919.       WHILE NEXT.FOUND > 0
  1920.          NUM.FINDS = NUM.FINDS + 1
  1921.          WHERE.FOUND = NEXT.FOUND
  1922.          NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1923.       WEND
  1924.       END SUB
  1925. ' $SUBTITLE: 'SECURE - subroutine to assign security to commands'
  1926. ' $PAGE
  1927. '
  1928. '  SUBROUTINE NAME    -- SECURE
  1929. '
  1930. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1931. '                        SECTION$           NAME OF THE SECTION
  1932. '                        DEFAULTS$          DEFAULT COMMANDS FOR THE SECTION
  1933. '                        NUMBER.OF.COMMANDS NUMBER OF COMMANDS IN THE SECTION
  1934. '                        COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1935. '                                              CHARACTER COMMANDS
  1936. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1937. '                                           THE COMMAND
  1938. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1939. '                                             THE SECTION
  1940. '
  1941. '  OUTPUT PARAMETERS  -- COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1942. '                                              CHARACTER COMMANDS
  1943. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1944. '                                           THE COMMAND
  1945. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1946. '                                             THE SECTION
  1947. '
  1948. '  SUBROUTINE PURPOSE -- ALLOWS USERS TO MODIFY COMMANDS AND SECURITY FOR
  1949. '                        EACH COMMAND.
  1950. '
  1951.       SUB SECURE (SECTION$,DEFAULTS$,NUMBER.OF.COMMANDS,COMMANDS$(2),COMMANDS(1),SECTION.COMMANDS$) STATIC
  1952. 61860 IF IPAGE = 2 OR _
  1953.          VAL(OPTION$) = 310 THEN _
  1954.          XX$ = "ALL " + _
  1955.                SECTION$ + _
  1956.                " commands use default letters?" _
  1957.       ELSE XX$ = "ALL " + _
  1958.                SECTION$ + _
  1959.                " commands = SAME security level?"
  1960.       LOCATE 24,1
  1961.       PRINT SPACE$(79);
  1962.       LOCATE 24,1
  1963.       CALL GETNUMYN (XX$,AB)
  1964.       IF NOT AB THEN _
  1965.          GOTO 61880
  1966. 61870 IF IPAGE = 2 OR _
  1967.          VAL(OPTION$) = 310 THEN _
  1968.          SECTION.COMMANDS$ = DEFAULTS$ : _
  1969.          FOR I = 1 TO NUMBER.OF.COMMANDS : _
  1970.             COMMANDS$(I,2) = MID$(SECTION.COMMANDS$,I,1) : _
  1971.          NEXT : _
  1972.          EXIT SUB
  1973.       CALL MMINTEGER("Security level for all " + _
  1974.                       SECTION$ + _
  1975.                      " commands is?",-32767,32767,B1)
  1976.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1977.          COMMANDS(I) = B1
  1978.       NEXT
  1979.       GB = B1
  1980.       EXIT SUB
  1981. 61880 GOSUB 61900
  1982.       IROW = 4
  1983.       ICOL = 10
  1984.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1985.          LOCATE IROW + I,ICOL
  1986.          IF IPAGE = 2 OR _
  1987.             VAL(OPTION$) = 310 THEN _
  1988.             PRINT COMMANDS$(I,1);" ";COMMANDS$(I,2) _
  1989.          ELSE PRINT COMMANDS$(I,1);STR$(COMMANDS(I))
  1990.       NEXT
  1991. 61890 CALL ASKRO("Enter first character of command ([ENTER] quits)",24,X$)
  1992.       IF X$ = "" THEN _
  1993.          EXIT SUB
  1994.       IF LEN(X$) <> 1 THEN _
  1995.          GOTO 61890
  1996.       CALL ALLCAPS(X$)
  1997.       FF = INSTR(DEFAULTS$,X$)
  1998.       IF FF = 0 THEN _
  1999.          GOTO 61890
  2000.       IF IPAGE = 2 OR _
  2001.          VAL(OPTION$) = 310 THEN _
  2002.          GOTO 61892
  2003.       CALL MMINTEGER("Security level for all " + _
  2004.                       SECTION$ + _
  2005.                      " '" + _
  2006.                      X$ + _
  2007.                      "' commands is?",-32767,32767,B1)
  2008.       GOTO 61893
  2009. 61892 CALL ASKRO("New command for " + _
  2010.                   MID$(COMMANDS$(FF,1),1,INSTR(COMMANDS$(FF,1),"  ")) + _
  2011.                  "is?",24,HK$)
  2012.       X$ = MID$(HK$,1,1)
  2013.     '  CALL ALLCAPS (X$)      ' commented out to allow Shifted characters
  2014.     ' to be used for COMMANDS in Utility/File/Main section  Pe 09/10/89
  2015.       IF LEN(HK$) > 1 THEN _
  2016.          HK$ = X$ + MID$(HK$,2)
  2017.       IF LEN (HK$) = 1 THEN _
  2018.          HK$ = X$
  2019.       COMMANDS$(FF,2) = HK$
  2020.       MID$(SECTION.COMMANDS$,FF,1) = HK$
  2021.       GOTO 61880
  2022. 61893 COMMANDS(FF) = B1
  2023.       GOTO 61880
  2024. '
  2025. ' * COMMON ROUTINE TO DISPLAY SUBSYSTEM COMMANDS AND THEIR SECURITY LEVELS
  2026. '
  2027. 61900 CLS
  2028.       I! = FRE(C$)
  2029.       COLOR 0,7,0
  2030.       LOCATE 1,23
  2031.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " Default Configuration";
  2032.       COLOR FG,BG,BORDER
  2033.       LOCATE  2,5
  2034.       PRINT "The RBBS-PC " + _
  2035.              SECTION$ + _
  2036.             " Commands are as follows:"
  2037.       LOCATE   3,10
  2038.       XX$ = "Command             Security"
  2039.       IF IPAGE = 2 OR _
  2040.          VAL(OPTION$) = 310 THEN _
  2041.          XX$ = "Description         Command"
  2042.       PRINT XX$
  2043.       RETURN
  2044.       END SUB
  2045. '  $SUBTITLE: 'GETCOLOR - get colors using natural language'
  2046. '  $PAGE
  2047. '
  2048. '  SUBROUTINE NAME    -- GETCOLOR
  2049. '
  2050. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2051. '                        STRNG$             TITLE OF WHAT COLOR IS FOR
  2052. '                        NUM.COLOR          CURRENT COLOR SETTING
  2053. '
  2054. '  OUTPUT PARAMETERS  -- NUM.COLOR          NEW COLOR SETTING
  2055. '
  2056. '  SUBROUTINE PURPOSE -- SET THE COLOR USING NATURAL LANGUAGE PHRASES
  2057. '
  2058.       SUB GETCOLOR (STRNG$,NUM.COLOR) STATIC
  2059.       CLS
  2060. 61950 IF NUM.COLOR > 7 THEN _
  2061.          X = NUM.COLOR - 8 _
  2062.       ELSE X = NUM.COLOR
  2063.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",X*6+1,6)
  2064.       LOCATE 9,15
  2065.       PRINT STRNG$;" now ";X$;"     ";
  2066. 61955 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",20,ANS$)
  2067.       IF ANS$ = "" THEN _
  2068.          EXIT SUB
  2069.       CALL ALLCAPS (ANS$)
  2070.       Y = INSTR("NBGCRPYW",ANS$) - 1
  2071.       IF Y < 0 THEN _
  2072.          GOTO 61955
  2073.       NUM.COLOR = Y
  2074.       GOTO 61950
  2075.       END SUB
  2076. ' $SUBTITLE: 'GETANSI - SUBROUTINE TO GET CALLERS COLOR VALUES'
  2077. ' $PAGE
  2078. '
  2079. '  SUBROUTINE NAME    -- GETANSI
  2080. '
  2081. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2082. '                        SELECTION$       NAME OF SELECTION TO HAVE COLOR
  2083. '                        PRMPT$           WHAT TO PROMPT ON THE SCREEN
  2084. '
  2085. '  OUTPUT PARAMETERS  -- FG.1.DEF$        FIRST COLOR SELECTION
  2086. '                        FG.2.DEF$        SECOND COLOR SELECTION
  2087. '                        FG.3.DEF$        THIRD COLOR SELECTION
  2088. '                        FG.4.DEF$        FOURTH COLOR SELECTION
  2089. '
  2090. '  SUBROUTINE PURPOSE -- ASK THE SYSOP TO SELECT THE FOUR COLORS TO BE
  2091. '                        USED FOR CALLERS THAT SELECT COLOR DISPLAYS.
  2092. '
  2093.       SUB GETANSI (SELECTION$,PRMPT$) STATIC
  2094.       CLS
  2095. 62000 LOCATE 8,10
  2096.       PRINT PRMPT$;" Foreground for caller now ";SELECTION$;"       "
  2097.       LOCATE 10,1
  2098.       PRINT "Current foreground selections: ";
  2099.       CALL COLORCODE (FG.1.DEF$,X$,X)
  2100.       COLOR X,CALLER.BKGRD
  2101.       PRINT "First ";
  2102.       CALL COLORCODE (FG.2.DEF$,X$,X)
  2103.       COLOR X
  2104.       PRINT "Second ";
  2105.       CALL COLORCODE (FG.3.DEF$,X$,X)
  2106.       COLOR X
  2107.       PRINT "Third ";
  2108.       CALL COLORCODE (FG.4.DEF$,X$,X)
  2109.       COLOR X
  2110.       PRINT "Fourth"
  2111.       COLOR FG,BG
  2112. 62040 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",14,ANS$)
  2113.       IF ANS$ = "" THEN _
  2114.          EXIT SUB
  2115.       CALL ALLCAPS (ANS$)
  2116.       X = INSTR("NRGYBPCW",ANS$)
  2117.       IF X < 2 THEN _
  2118.          SELECTION$ = NONE.PICKED$ : _
  2119.          GOTO 62000
  2120.       X$ = MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-11,6)
  2121.       CALL ASKRO ("Make "+X$+" [B]right, or N)ormal",17,ANS$)
  2122.       CALL ALLCAPS (ANS$)
  2123.       IF ANS$ <> "N" THEN _
  2124.          SELECTION$ = "Bright " + X$ _
  2125.       ELSE SELECTION$ = "Normal " + X$
  2126.       GOTO 62000
  2127.       END SUB
  2128. ' $SUBTITLE: 'COLORCODE - SUBROUTINE TO GET COLOR CODES'
  2129. ' $PAGE
  2130. '
  2131. '  SUBROUTINE NAME    -- COLORCODE
  2132. '
  2133. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2134. '                        NAT.LANG.COLOR$  NATURAL LANGUAGE LETTER OF COLOR
  2135. '                                           N = NONE
  2136. '                                           B = BLUE
  2137. '                                           G = GREEN
  2138. '                                           C = CYAN
  2139. '                                           R = RED
  2140. '                                           P = PURPLE
  2141. '                                           Y = YELLOW
  2142. '                                           W = WHITE
  2143. '
  2144. '  OUTPUT PARAMETERS  -- ANSI.COLOR$      CORRECT CHARACTER SEQUENCE OF COLOR
  2145. '                        BASIC.FG         NUMBER FOR BASIC FORGROUND
  2146. '
  2147. '  SUBROUTINE PURPOSE -- TO CONVERT THE NATURAL LANGUAGE COLOR SELECTION INTO
  2148. '                        COLOR CODES THAT ARE MEANINGFUL.
  2149. '
  2150.       SUB COLORCODE (NAT.LANG.COLOR$,ANSI.COLOR$,BASIC.FG) STATIC
  2151.       BASIC.FG = 7
  2152.       IF NAT.LANG.COLOR$ = NONE.PICKED$ THEN _
  2153.          ANSI.COLOR$ = "" : _
  2154.          EXIT SUB
  2155.       X = INSTR(" BN",LEFT$(NAT.LANG.COLOR$,1))
  2156.       IF X < 2 THEN _
  2157.          EXIT SUB
  2158.       X$ = MID$("10",X-1,1)
  2159.       X = INSTR(NAT.LANG.COLOR$," ")
  2160.       IF X < 1 OR X >= LEN(NAT.LANG.COLOR$) THEN _
  2161.          EXIT SUB
  2162.       Z$ = MID$(NAT.LANG.COLOR$,X+1,1)
  2163.       X = INSTR("RGYBPCW",Z$)
  2164.       IF X < 1 THEN _
  2165.          EXIT SUB
  2166.       BASIC.FG = INSTR("BGCRPYW",Z$) - 8 * (X$="1")
  2167.       Y$ = MID$(STR$(30+X),2)
  2168.       Z = INSTR("NRGYBPCW",MID$("NBGCRPYW",CALLER.BKGRD+1,1))
  2169.       Z$ = MID$(STR$(39+Z),2)
  2170.       ANSI.COLOR$ = CHR$(27) + "[" + X$ + ";" + Z$ + ";" + Y$ + "m"
  2171.       END SUB
  2172. ' $SUBTITLE: 'ANSIDECODE - SUBROUTINE TO DECODE ANSI VALUES'
  2173. ' $PAGE
  2174. '
  2175. '  SUBROUTINE NAME    -- ANSIDECODE
  2176. '
  2177. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2178. '                        ANSI.EXPRESSION$ EXPRESSION WITH ANSI COLOR CODES IN
  2179. '
  2180. '  OUTPUT PARAMETERS  -- ANSI.EXPRESSION$ ENGLISH LANGUAGE DESCRIPTION OF COLOR
  2181. '
  2182. '  SUBROUTINE PURPOSE -- DECODES THE ANSI EXPRESSION INTO A MEANINGFUL
  2183. '                        ENGLISH TEXT DESCRIPTION.
  2184. '
  2185.       SUB ANSIDECODE (ANSI.EXPRESSION$) STATIC
  2186.       IF LEN (ANSI.EXPRESSION$) < 3 THEN _
  2187.          EXIT SUB
  2188.       IF ASC(ANSI.EXPRESSION$) <> 27 THEN _
  2189.          EXIT SUB
  2190.       X = INSTR(ANSI.EXPRESSION$,";")
  2191.       IF X < 1 THEN _
  2192.          EXIT SUB
  2193.       IF MID$(ANSI.EXPRESSION$,X-1,1) = "1" THEN _
  2194.          X$ = "Bright " _
  2195.       ELSE X$ = "Normal "
  2196.       X = INSTR(X,ANSI.EXPRESSION$,"m")
  2197.       IF X < 1 THEN _
  2198.          EXIT SUB
  2199.       X = VAL(MID$(ANSI.EXPRESSION$,X-2,2)) - 30
  2200.       IF X < 1 OR X > 7 THEN _
  2201.          EXIT SUB
  2202.       ANSI.EXPRESSION$ = X$ + MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-5,6)
  2203.       END SUB
  2204.